目前我正在使用 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
}
可以看到,returnList<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
,它不知道什么是 a TableQuery<T>
,我需要像using SQLite.Query
在业务层项目中一样添加新的引用和导入命名空间。它确实带来了糟糕的代码感觉。为什么我的业务层要知道数据库的细节?为什么业务层要知道什么是 SQLite?那么正确的设计是什么?