c# - 数据访问层(DAL)中的LINQ查询方法

标签 c# .net linq architecture data-access-layer

基于经典三层的项目:UI(在这个问题中并不重要)、业务逻辑层和数据访问层。我有几个表:客户 产品 订单 用户。设计应该是:

//DAL methods
public IEnumerable<Customer> GetAllCustomers()
public IEnumerable<Product> GetAllProducts()
public IEnumerable<Order> GetAllOrders()
public IEnumerable<User> GetAllUsers()
//BLL methods
public IEnumerable<Order> GetOrders(long CustomerID)
public IEnumerable<Product> GetProducts(long CustomerID)
public IEnumerable<Product> GetProducts(long OrderID)

令我困惑的是,我发现DAL中的所有方法都是GetAllXXXX。我不得不承认这个设计效果很好。在 DAL 中,只有 GetAll 方法。在 BLL 中,除了 GetAll 方法的组合操作(过滤/连接/选择)之外什么都没有。很奇怪吗?正确的做法是什么?

最佳答案

不,这并不奇怪,事实上,这与我的做法非常相似。

对我来说唯一的区别是:

  • 我使用IQueryable<T>而不是IEnumerable<T> (获得延迟执行)
  • 我有一个通用存储库( Repository<T> ):
    • IQueryable<T> Find()
    • void Add(T)
    • 等等等等

这样,我的存储库就保持干净/简单。

所以你的 BLL 可以这样实现:

public IEnumerable<Order> GetOrders(long CustomerID)
{
   Repository<Order> orderRepository = new Repository<Order>(); // should use DI here, but i digress
   return orderRepository
             .Find() // no query executed...
             .Where(o => o.CustomerID == CustomerID) // still nothing...
             .ToList(); // query executed, with BL applied! cool!
}

使 BLL 执行投影/工作/逻辑。存储库只处理 T 的持久性,不关心实际类型或任何业务逻辑。

反正我就是这么做的。

关于c# - 数据访问层(DAL)中的LINQ查询方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4084128/

相关文章:

.net - 如何密封被覆盖的属性(property)

c# - 这是什么魔法?

.net - .Take() 还是不.Take(),这是个问题

c# - 从控制台读取值

c# - 如何避免使用成员(member)提供者?

c# - 隐藏ZedGraph控件的灰色边框

c# - LINQ 获取列表列表

c# - 将文本拆分为 2 种颜色

c# - FastMember ObjectReader 不适用于继承的接口(interface)

sql-server - 使用 linq 获取表中列的第一个字符