linq2sql,repository pattern - 如何从两个或多个表中查询数据?

时间:2010-11-30 08:19:57

标签: performance linq-to-sql architecture repository-pattern

我使用Repository模式(和linq2sql作为数据访问),例如,ProductsRep和CustomersRep。

在非常简单的场景中,db有两个表 - Produsts (ProductID,CustomerID,ProductName,Date)和 Customer (CustomerID,FirstName,LastName)。

每个存储库都提供了创建,更新,删除和获取特定模型对象的方法,也可能是某些过滤器。

但是,如果我想查询按产品名称购买特定产品的所有客户,我必须使用ProductsRep获取此产品的ProductID,然后使用CustomersRep获取所有使用此ID购买产品的客户。

我是对的吗?这实际上是l2s必须生成的两个sql请求,是否可以只执行一个请求?

而且,一般来说,如果我们想要使用具有关系和存储库模式的多个表来查询数据,那么如何通过将查询量减少到最小来做到这一点?

感谢。

2 个答案:

答案 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位于同一个数据库中,这应该会为您提供单个数据库查询请求。