代码之家  ›  专栏  ›  技术社区  ›  Cheng Chen

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

  •  2
  • Cheng Chen  · 技术社区  · 14 年前

    Customers Products Orders Users . 设计应该是:

    //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)
    

    3 回复  |  直到 14 年前
        1
  •  2
  •   RPM1984    14 年前

    不,这并不奇怪,事实上这和我做的很相似。

    • 我用 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的持久性,不关心实际的类型或任何业务逻辑。

        2
  •  1
  •   p.campbell    14 年前

    考虑您的数据访问层 能够

    • 创建
    • 删除
    • GetSingleCustomer()
    • CalculateUpperManagementTuesdayReport()

    我不认为这很奇怪,但也许您的DAL不需要提供这些服务,因为您的应用程序不需要它们。

    我希望你的筛选/加入/选择在BL中 IQueryable<t> 而不是 IEnumerable<T> . 这意味着在调用 Single() , First() , ToList() , Count()

        3
  •  0
  •   Gishu    14 年前

    我的问题是如果你合并当前的BLL和DAL你会失去什么?-它们似乎都在处理从持久化数据(DBs)到对象的桥梁。。似乎是最简单的方法。 另一种看待它的方式是本地化的变更?e、 g.如果DAL层发生变化,该层会被隔离还是会波及到上层(这是不可取的)。