优化多个 LINQ to Entity Framework 查询
Posted
技术标签:
【中文标题】优化多个 LINQ to Entity Framework 查询【英文标题】:Optimizing multiple LINQ to Entity Framework queries 【发布时间】:2010-10-25 08:17:31 【问题描述】:我有 2 个具有多对多关系的实体框架实体集(由 3 个数据库表组成)。举例来说,假设我有一个 Worker 实体和一个 Company 实体,其中每个工人可以在多个公司工作,每个公司可以有很多工人。
我想为每个工人检索他/她工作的所有公司。直接的方法是为每个工作人员创建一个查询,该查询将使用关联表和公司表之间的连接来获取公司,但这会导致每个工作人员往返于数据库。
我相信这可以以更好更优化的方式完成。任何帮助将不胜感激。
谢谢。
【问题讨论】:
【参考方案1】:如果您的联接表没有任何额外信息(只有 Worker 和 Company 的 ID),您的模型中应该只有两个实体:Worker
和 Company
。如果 EF 4 实体图默认是预先加载的,所以除非您通过执行 (context.ContextOptions.LazyLoadingEnabled = true;
) 启用 LazyLoading,否则每当您查询工作人员时,您都会获得公司列表:
var workers = context.Workers.ToList();
// Companies already loaded - do something with them
var companiesForWorker0 = workers[0].Companies; // Don't forget to check
... // for null in real code
您也可以直接告诉 EF 在查询工作人员时预先加载公司(如果启用了 LazyLoading,这将是必要的):
var workers = context.Workers.Include("Companies").ToList();
【讨论】:
我意识到连接表也是一个实体是一个错误。【参考方案2】:这是我在 Linq2SQL 中所做的,可能对你有用。
-
查询 #1。
在一个列表中收集所有工作人员的“ID”。
使用此列表传递给辅助查询(即
where list.Contains(item)
)。
现在应该只需要 2 个查询。
如果需要,您可以将它们组合成一个查询,但需要付出更多的努力。
【讨论】:
是的,这就是您在 L2S 中必须做的事情,因为它会为连接表生成一个实体。只有在连接表包含额外数据并且模型中存在第三个实体的情况下,才需要在 EF 中。以上是关于优化多个 LINQ to Entity Framework 查询的主要内容,如果未能解决你的问题,请参考以下文章