【问题标题】:Optimizing multiple LINQ to Entity Framework queries优化多个 LINQ to Entity Framework 查询
【发布时间】:2010-10-25 08:17:31
【问题描述】:

我有 2 个具有多对多关系的实体框架实体集(由 3 个数据库表组成)。举例来说,假设我有一个 Worker 实体和一个 Company 实体,其中每个工人可以在多个公司工作,每个公司可以有很多工人。

我想为每个工人检索他/她工作的所有公司。直接的方法是为每个工作人员创建一个查询,该查询将使用关联表和公司表之间的连接来获取公司,但这会导致每个工作人员往返于数据库。

我相信这可以以更好更优化的方式完成。任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: entity-framework optimization linq-to-entities


    【解决方案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. 查询 #1。
    2. 在一个列表中收集所有工作人员的“ID”。
    3. 使用此列表传递给辅助查询(即where list.Contains(item))。

    现在应该只需要 2 个查询。

    如果需要,您可以将它们组合成一个查询,但需要付出更多的努力。

    【讨论】:

    • 是的,这就是您在 L2S 中必须做的事情,因为它会为连接表生成一个实体。只有在连接表包含额外数据并且模型中存在第三个实体的情况下,才需要在 EF 中。
    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多