目前我正在使用 sqlite 构建一个 Windows 应用程序。在数据库中有一个表说 User
, 在我的代码中有一个 Repository<User>
和一个 UserManager
.我认为这是一个非常普遍的设计。在存储库中有一个 List
方法:
//Repository<User> class
public List<User> List(where, orderby, topN parameters and etc)
{
//query and return
}
这带来了一个问题,如果我想在 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
}
可以看到,返回List<User>
带来性能问题,因为查询比预期更早执行。现在我需要将其更改为类似 IQueryable<T>
的内容:
//Repository<User> class
public TableQuery<User> List(where, orderby, topN parameters and etc)
{
//query and return
}
TableQuery<T>
是sqlite驱动的一部分,几乎等于IQueryable<T>
在 EF 中,它提供查询但不会立即执行。但现在的问题是:在UserManager.cs
, 它不知道什么是 TableQuery<T>
,我需要添加新的引用并导入 namespace ,例如 using SQLite.Query
在业务层项目中。确实带来了糟糕的代码感。为什么我的业务层要知道数据库的细节?为什么业务层要知道什么是SQLite?那么正确的设计是什么?
最佳答案
我建议您使用 IEnumerable<T>
而不是 IQueryable<T>
,这也允许延迟加载。 IEnumerable
但是,这并不意味着您可以任何 方式查询数据。您的 DB LINQ 提供程序可能会减少功能集。
关于c# - 在 Repository<T> 中返回 Queryable<T> 或 List<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12259062/