Performance linq2sql,存储库模式-如何从两个或多个表查询数据?

Performance linq2sql,存储库模式-如何从两个或多个表查询数据?,performance,linq-to-sql,architecture,repository-pattern,Performance,Linq To Sql,Architecture,Repository Pattern,我使用存储库模式(使用linq2sql作为数据访问),并拥有ProductsRep和CustomerRep 在非常简单的场景中,db有两个表-Produsts(ProductID、CustomerID、ProductName、Date)和Customer(CustomerID、FirstName、LastName) 每个存储库都提供了创建、更新、删除和获取特定模型对象的方法,可能还有一些过滤器 但是,如果我想按产品名称查询购买特定产品的所有客户,我必须使用ProductsRep获取此产品的Pro

我使用存储库模式(使用linq2sql作为数据访问),并拥有ProductsRep和CustomerRep

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

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

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

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

一般来说,如果我们想使用多个具有关系和存储库模式的表来查询数据,如何将查询量减少到最小

谢谢

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和CustomerRep在同一个数据库中,这将为您提供一个数据库查询请求。

想想您所做的陈述:

但如果我想查询所有客户 按产品购买特定产品 name,我必须得到这个的ProductID 使用ProductsRep的产品,然后获取 所有购买带有 此id使用CustomerRep

那有点麻烦创建一个存储库,以促进您所在领域的孤立区域的行为,而不是针对每个业务实体。

DDD/Repository的一个常见错误是考虑数据。不。想想你的行为

您有一个产品实体,它指的是客户。这意味着没有客户,产品就不可能存在。对吗?因此,客户是您的聚合根-它控制域模型这一部分的行为

您对上述答案的评论证实了-您正在跨多个存储库工作。您有两个选择—1)工作单元,2)修复存储库设计

您只需要一个存储库—我们称之为CustomerProductRepository

然后执行上述查询:

var customersWhoBuyHats = customerProductRepository
                             .Products
                             .Include("Customer")
                             .Where(x => x.ProductName == "Hat")
                             .Select(x => x.Customer)
                             .ToList();
结果是一个
列表
,您只需一次数据库调用即可完成


HTH.

如果你能画出你的表格,你的问题就更容易理解了。名称和列。请在文本中使用一些换行符。您不应该按表对存储库进行分组(如果您应该对它们进行分组),而应该按用法进行分组。如果在CustomerRep和ProductsRep中有一个方法GetAll()返回所有实体的IQueryable,并且我们使用您的方法,我们会立即得到异常“查询包含对在不同数据上下文中定义的项的引用。“,因为存储库被引用到不同的datacontext中,所以将表放在两个不同的上下文中会有什么好处?我尝试实现存储库模式,其中每个存储库都创建自己的datacontext,现在我明白这对于某些场景来说不是个好主意……我的坏消息是,忘记了您使用的是L2SQL<代码>包含是EF。L2SQL中的等效项是
DataLoadOptions
。我希望你能得到我最准确的答案。还有一点——带有IQueryable的存储库确实不适合L2SQL。如果你想得到这个DDDY,那么你应该考虑移动到实体框架。我发现了另外两个解决方案,这可能是相当好的。1) 我们对所有存储库使用一个DataContext实例,因此可以毫无例外地使用IQueryable进行操作。2) 为了从多个表中检索数据,我们使用db中的视图,这些视图映射到使用L2S和存储库的类,仅用于CRUD。这种方法怎么样?为什么带有IQueryable的存储库真的不适合L2SQL?您应该使用方法1。我不知道为什么您需要多个数据上下文,除非您在不同的机器上有数据库。将DataContext传递给存储库的ctor,这样所有存储库都可以使用相同的DC。关于我关于Repository/IQueryable with L2SQL的声明,L2SQL不支持表的POCO映射。这意味着您的IQueryable/存储库正在将实际的表实体返回到较低的层。除非您手动将它们投影到POCO中,但如何保存此实体?您需要从左到右的属性复制来将POCO转换为L2SQL实体。无论哪种方式,您的存储库都变得过于复杂,无法满足其目的。EF支持POCO开箱即用,使抽象变得非常简单。现在我使用您描述的方法-我的存储库返回POCO对象,这些对象转换为L2SQL实体,反之亦然,这相当复杂,是的。我相信我迟早应该开始学习EF。