我读过存储库不应该使用IQueryable。简单的存储库示例有ListAll、FindById、Add、Delete。下面是一个示例产品库ListAll。如果我不能覆盖查询,并且需要搜索查询,例如,按类别划分的ProductTable或按权重计算的ProductTable (复杂的查询),那么我将需要DAO (数据访问对象模式)。
所以问题是,
(a)在同一个应用程序中使用存储库模式和DAO模式可以吗?
(b)这是否绕过了拥有DDD储存模式的全部意义?
如何访问具有Intriciate请求的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?
发布于 2018-10-02 10:36:08
存储库面向聚合。它返回一个主要用于事务目的的完全组成的聚合。对数据的更改是通过聚合实现的。您不应该真正地查询聚合,因为它们可能不是返回相关/简明数据的最佳方法。
查询层是一个读取模型,它在尽可能轻量级的机制中只返回相关数据。您可能认为这是一个DAO,但是它实际上并不是一回事,尽管它非常肯定地关注于数据检索。
从这个意义上说,你提议的是i.t.o.。这两种机制不仅是可行的,而且我强烈建议您这样做:)
由于这两种机制之间的意图是如此不同,使用查询机制绝不会降低存储库的有用性。
https://stackoverflow.com/questions/52603576
复制相似问题