优化多个 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),您的模型中应该只有两个实体:WorkerCompany。如果 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

Linq To Entity 查询条件扩展

初识Linq to Entity

linq to entity常用操作

LINQ to Entity 减去 2 个日期

什么是 Linq to Entity?

LINQ to entity中的一些误解