Linq to sql 过滤时Include()的顺序对性能有影响吗?

Linq to sql 过滤时Include()的顺序对性能有影响吗?,linq-to-sql,entity-framework-6,Linq To Sql,Entity Framework 6,这很好,我假设它加载了所有带有Foo和Bar子对象的所有实体,然后根据Foo的值过滤结果: var baz = "sillystring"; context.Entities .Include(e => e.Foo) .Include(e => e.Bar) .Where(e.Foo == baz) .Select(e.Bar) .ToList(); 如果是这样的话,这是否是一个有用的优化,首先进行过滤,然后只为

这很好,我假设它加载了所有带有
Foo
Bar
子对象的所有实体,然后根据
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

事实是,在这种情况下,它实际上并不重要,因为
都被忽略。您可以删除它们,查询将生成完全相同的SQL和结果

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

许多人误解了Include的目的。对于使用导航属性进行过滤、排序、分组、选择等的查询的正确运行来说,根本不需要它们。它们的全部目的是

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