在存储库<T>中返回Queryable <T>或List <T>

Che*_*hen 6 .net c# architecture data-access-layer business-layer

目前我正在使用sqlite构建一个Windows应用程序.在数据库中有一个表说User,在我的代码中有一个Repository<User>和一个UserManager.我认为这是一个非常常见的设计.在存储库中有一个List方法:

//Repository<User> class
public List<User> List(where, orderby, topN parameters and etc)
{
    //query and return
}
Run Code Online (Sandbox Code Playgroud)

这带来了一个问题,如果我想做一些复杂的事情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
}
Run Code Online (Sandbox Code Playgroud)

你可以看到,返回List<User>会带来性能问题,因为查询的执行时间早于预期.现在我需要将其更改为IQueryable<T>:

//Repository<User> class
public TableQuery<User> List(where, orderby, topN parameters and etc)
{
    //query and return
}
Run Code Online (Sandbox Code Playgroud)

TableQuery<T>是sqlite驱动程序的一部分,它几乎等于IQueryable<T>EF,它提供查询并且不会立即执行它.但现在的问题是:在UserManager.cs,它不知道什么是TableQuery<T>,我需要添加新的引用和导入名称空间,如using SQLite.Query在业务层项目中.它真的带来了糟糕的代码感觉.为什么我的业务层应该知道数据库的细节?为什么业务层应该知道什么是SQLite?那么正确的设计是什么?

Mat*_*eid 2

我建议您使用IEnumerable<T>而不是IQueryable<T>,它也允许延迟加载。IEnumerable但是,并不意味着您可以以任何方式查询数据。您的 DB LINQ 提供程序可能会减少功能集。