return Queryable<T> or List<T> in a Repository<T>
Posted
by
Danny Chen
on Stack Overflow
See other posts from Stack Overflow
or by Danny Chen
Published on 2012-09-04T07:56:03Z
Indexed on
2012/09/04
15:39 UTC
Read the original article
Hit count: 218
Currently I'm building an windows application using sqlite. In the data base there is a table say User
, and in my code there is a Repository<User>
and a UserManager
. I think it's a very common design. In the repository there is a List
method:
//Repository<User> class
public List<User> List(where, orderby, topN parameters and etc)
{
//query and return
}
This brings a problem, if I want to do something complex in UserManager.cs
:
//UserManager.cs
public List<User> ListUsersWithBankAccounts()
{
var userRep = new UserRepository();
var bankRep = new BankAccountRepository();
var result = //do something complex, say "I want the users live in NY
//and have at least two bank accounts in the system
}
You can see, returning List<User>
brings performance issue, becuase the query is executed earlier than expected. Now I need to change it to something like a IQueryable<T>
:
//Repository<User> class
public TableQuery<User> List(where, orderby, topN parameters and etc)
{
//query and return
}
TableQuery<T>
is part of the sqlite driver, which is almost equals to IQueryable<T>
in EF, which provides a query and won't execute it immediately. But now the problem is: in UserManager.cs
, it doesn't know what is a TableQuery<T>
, I need to add new reference and import namespaces like using SQLite.Query
in the business layer project. It really brings bad code feeling. Why should my business layer know the details of the database? why should the business layer know what's SQLite? What's the correct design then?
© Stack Overflow or respective owner