我使用Repository模式(和linq2sql作为数据访问),例如,ProductsRep和CustomersRep。
在非常简单的场景中,db有两个表 - Produsts (ProductID,CustomerID,ProductName,Date)和 Customer (CustomerID,FirstName,LastName)。
每个存储库都提供了创建,更新,删除和获取特定模型对象的方法,也可能是某些过滤器。
但是,如果我想查询按产品名称购买特定产品的所有客户,我必须使用ProductsRep获取此产品的ProductID,然后使用CustomersRep获取所有使用此ID购买产品的客户。
我是对的吗?这实际上是l2s必须生成的两个sql请求,是否可以只执行一个请求?
而且,一般来说,如果我们想要使用具有关系和存储库模式的多个表来查询数据,那么如何通过将查询量减少到最小来做到这一点?
感谢。
答案 0 :(得分:3)
想想你所做的陈述:
但如果我想查询所有客户 按产品购买特定产品 名字,我必须得到这个的ProductID 产品使用ProductsRep然后得到 所有购买产品的客户 这个id使用CustomersRep。
那闻起来很麻烦。 创建存储库以促进域中隔离区域的行为,而不是针对每个业务实体。
DDD / Repository常见的错误是考虑数据。别。想想行为。
您有产品实体,该实体引用客户。这意味着没有客户就无法存在产品。对?因此,客户是您的聚合根 - 它控制着您的域模型的这一部分的行为。
您对上述答案的评论确认 - 您正在跨多个存储库工作。您有两个选择 - 1)工作单元,2)修复您的存储库设计。
您只需要1个存储库 - 我们称之为 CustomerProductRepository 。
然后执行上述查询:
var customersWhoBuyHats = customerProductRepository
.Products
.Include("Customer")
.Where(x => x.ProductName == "Hat")
.Select(x => x.Customer)
.ToList();
结果是 List<Customer>
,您通过一次数据库调用完成了这项工作。
HTH。
答案 1 :(得分:0)
var customers = from cust in CustomersRep
join prod in ProductsRep on prod.CustomerID equals cust.CustomerID
where prod.ProductName == yourInput
select cust;
您可以编写一个类似于SQL(本质上)的查询。在上面yourInput
是保存您感兴趣的产品名称的变量。
只要ProductsRep和CustomersRep位于同一个数据库中,这应该会为您提供单个数据库查询请求。