c# - 在 Repository<T> 中返回 Queryable<T> 或 List<T>

标签 c# .net 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
}

这带来了一个问题,如果我想在 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/

相关文章:

c# - 网格中无行和无列子项的奇怪行为

java - 使用AWS S3作为监控平台的中间存储层

ios - 验证期间的 iTunes 连接架构问题

node.js - postgres 中的大量数据库 - 架构最佳实践

c# - 具有泛型和 DI 的存储库模式

c# - 在 PostgreSQL 中使用特定模式的 Linq 和实体迁移

c# - 如何用空格表示枚举值?

.net - 在 .NET 中编写虚拟打印机

c# - 单声道 HTTPS 错误 - "Error Writing Headers"

c# - StructureMap 有条件使用