我使用存储库模式(和 linq2sql 作为数据访问),并拥有例如 ProductsRep 和 CustomersRep。
在非常简单的场景中,数据库有两个表 -产品(产品 ID、客户 ID、产品名称、日期)和顾客(客户 ID、名字、姓氏)。
每个存储库都提供创建、更新、删除和获取特定模型对象的方法,并且可能是一些过滤器。
但是,如果我想按产品名称查询购买特定产品的所有客户,我必须使用 ProductsRep 获取该产品的 ProductID,然后使用 CustomersRep 获取使用该 id 购买产品的所有客户。
我对吗?这实际上是l2s必须生成的两个sql请求,是否可以只做一个请求?
而且,一般来说,如果我们想使用具有关系和存储库模式的多个表来查询数据,如何通过将查询量减少到最少来实现这一点?
Thanks.
想想你所做的陈述:
但如果我想查询所有客户
逐个购买特定产品
名称,我必须获取该产品的 ProductID
使用 ProductsRep 的产品然后得到
所有购买产品的客户
此 ID 使用 CustomersRep。
这闻起来有麻烦。创建存储库以促进域中隔离区域的行为,而不是针对每个业务实体。
DDD/Repository 的一个常见错误是考虑数据。不。想想行为。
你有一个Products实体指的是Customer。这意味着产品不能没有客户而存在。正确的?因此一个Customer是您的聚合根 - 它控制域模型这部分的行为。
您对上述答案的评论证实了 - 您正在跨多个存储库工作。您有两个选择 - 1)工作单元,2)修复您的存储库设计。
你只需要 1 个存储库——我们就这样称呼它吧客户产品库.
然后执行上面的查询:
var customersWhoBuyHats = customerProductRepository
.Products
.Include("Customer")
.Where(x => x.ProductName == "Hat")
.Select(x => x.Customer)
.ToList();
结果是List<Customer>
,并且您通过一次数据库调用就完成了这一任务。
HTH.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)