【问题标题】:Does the order of Include()s when filtering have an impact on performance?过滤时 Include() 的顺序对性能有影响吗?
【发布时间】:2018-10-11 19:27:46
【问题描述】:

这很好用,我假设它会加载所有带有 FooBar 子级的实体,然后根据 Foo 的值过滤结果:

var baz = "sillystring";
context.Entities
       .Include(e => e.Foo)
       .Include(e => e.Bar)
       .Where(e.Foo == baz)
       .Select(e.Bar)
       .ToList();

如果是这样的话,这是一个有用的优化吗?先进行过滤,然后只为一部分实体包含 Bar 子级?

var baz = "sillystring";
context.Entities
       .Include(e => e.Foo)
       .Where(e.Foo == baz)
       .Include(e => e.Bar) // moved to after the filter
       .Select(e.Bar)
       .ToList();

...另外,EF 是否足够聪明,知道当我使用.Select(e.Bar) 时必须包含Bar

【问题讨论】:

    标签: linq-to-sql entity-framework-6


    【解决方案1】:

    事实是,在这种情况下它真的无关紧要,因为Includes 都被忽略了。您可以删除它们,查询将产生完全相同的 SQL 和结果。

    这是因为Includes 仅在应用于查询结果根实体(如果有)时才有效。这意味着对于匿名 / DTO / ViewModel 等类型的投影 (Select) 查询,它们将被忽略。只考虑直接返回实体类型的查询,正如我之前所说,如果Includes 从该实体类型开始。

    很多人误解了Includes 的目的。使用导航属性进行过滤、排序、分组、选择等的查询的正确运行根本不需要它们。它们的全部目的是Load Related Entities

    在您的示例中,唯一有效的包含是Bar 的导航属性,并且它们必须插入 Select(e => e.Bar) 之后。它们的顺序并不重要,SelectInclude 之间的 LINQ 运算符只要不更改查询结果类型即可。

    【讨论】:

      猜你喜欢
      • 2012-09-01
      • 1970-01-01
      • 2011-04-18
      • 2014-12-05
      • 2015-04-17
      • 1970-01-01
      • 2018-01-06
      • 2020-02-05
      相关资源
      最近更新 更多