我阅读了存储库,不应使用IQueryable。简单的存储库示例具有ListAll,FindById,Add,Delete。以下是示例产品存储库ListAll。如果我无法覆盖查询,而需要搜索查询(例如,按类别的ProductTable或按重量的ProductTable(复杂查询)),则需要DAO(数据访问对象模式)。
问题是,
(a)可以在同一应用程序中使用存储库模式和DAO模式吗?
(b)难道这不会绕过拥有DDD存储库模式的全部问题吗?
在仍通过存储库的情况下,如何访问具有复杂请求的ProductTable?第一个存储库查询将很慢。
public virtual IEnumerable<Products> List()
{
return _dbContext.Products.AsEnumerable();
}
// This repository pattern will be slow, first it access all product and Then filters
var result = context.products()
.Where(o => o.ProductCategoryId== 5);
// This is dao pattern, with more specific queries
var result = context.products.AsEnumerable()
.Where(o => o.ProductCategoryId== 5);
Entity Framework Repository Pattern why not return Iqueryable?
答案 0 :(得分:0)
存储库 适用于汇总。它返回一个完全构成的聚合,主要用于交易目的。数据更改通过汇总进行。您不应该真的查询聚合,因为它们可能不是返回相关/简洁数据的最佳选择。
query 层是一个 read模型,它仅以尽可能轻量的机制返回相关数据。您可以 将其视为DAO,但实际上并没有什么不同,尽管它肯定是专注于数据检索。
从这个意义上说,你在提出什么建议。这两种机制不仅可行,而且我强烈建议您采用这种方式:)
由于这两种机制之间的意图如此不同,因此拥有查询机制绝不会降低存储库的实用性。