LINQ查询中包含的顺序和重要性是什么?

时间:2014-01-25 07:22:17

标签: c# linq

我有以下内容:

var objectives = _objectivesRepository
                .GetAll()
                .Where(o => o.ExamId == examId || examId == 0)
                .Include(o => o.ObjectiveDetails)
                .ToList();

在上一篇文章中,其中一位用户表示将include之前的位置放在LINQ查询中非常重要。

如果这是正确的,有人可以告诉我吗?订单有关系吗?如果有很多地方和包括在内怎么样?

2 个答案:

答案 0 :(得分:1)

在实体框架中是的,它确实很重要,但仅限于某些情况。使用分组或投影时,它将无法包含所请求的数据。

请参阅有关该主题的this博文。

答案 1 :(得分:1)

实际答案是通常,顺序无关紧要。在您的示例语句之后,我将描述关系查询的逻辑转换步骤:

  1. 获取所有对象及其所有属性(在关系代数中,它们被视为属性)
  2. 根据您的条件((relational algebra projection operation
  3. 限制检索到的行
  4. 限制急切加载的检索行的属性(relational algebra selection operation
  5. 在您的特定查询中,步骤2和3可以互换而不会改变最终结果。如上所述here,这是默认情况。尽管如此,即使最终结果不会改变,性能也会受到很大影响。这就是现代数据库具有查询优化器的原因,该查询优化器创建执行计划以优化特定查询。

    然而,并非总是如此。所以,我想你总能找到一个不适用上述情况的案例。关于绩效,没有任何假设是安全的。你应该总是衡量一些事情。您始终可以使用SQL Server profiler查看linq到实体查询到最终SQL查询的转换。然后,您可以使用最终SQL查询的SQL服务器工具(如query analyzer)到see the execution plan

    希望我帮忙!