【问题标题】:Is multiple .Where() statements in LINQ a performance issue?LINQ 中的多个 .Where() 语句是性能问题吗?
【发布时间】:2011-06-11 18:06:56
【问题描述】:

我想知道多个 .Where() 语句是否会对性能产生影响。例如我可以写:

var contracts =  Context.Contract
    .Where(
        c1 =>
            c1.EmployeeId == employeeId
        )
    .Where(
        c1 =>
            !Context.Contract.Any(
                c2 =>
                    c2.EmployeeId == employeeId
                    && c1.StoreId == c2.StoreId
                    && SqlFunctions.DateDiff("day", c2.TerminationDate.Value, c1.DateOfHire.Value) == 1
                )
        )
    .Where(
        c1 =>
            !Context.EmployeeTask.Any(
                t =>
                    t.ContractId == c1.Id
                )
        );

或者,我可以将它们全部组合到一个 Where() 子句中,如下所示:

var contracts =  Context.Contract
    .Where(
        c1 =>
            c1.EmployeeId == employeeId
            && !Context.Contract.Any(
                c2 =>
                    c2.EmployeeId == employeeId
                    && c1.StoreId == c2.StoreId
                    && SqlFunctions.DateDiff("day", c2.TerminationDate.Value, c1.DateOfHire.Value) == 1
                )
            && !Context.Employee_Task.Any(
                t =>
                    t.ContractId == c1.Id
                )
        );

Where() 子句链会损害性能还是等效?

【问题讨论】:

  • 我认为 LINQ 将两者编译成一个相似的表达式,不管你如何构建它(只要你不调用 ToList() 或介于 'Where's 之间的排序)

标签: c# performance linq where clause


【解决方案1】:

在 LINQ to Objects 中,对性能的影响非常小,因为基本上迭代器链会更长 - 获取下一个元素意味着要向上一长串 MoveNext() 调用。

在 LINQ to SQL 和类似的提供程序中,我希望以任何一种方式生成相同的 SQL,因此不会影响那里的性能。

编辑:自从写这篇文章以来,我发现了更多关于 LINQ to Objects 实现的信息——它是little more complicated...

【讨论】:

  • 好的。非常感谢。我不知道这个例子是否是最好的,但有时我认为如果我链接几个彼此无关的 where 语句,我会发现更容易阅读和理解一些查询。 /约翰
  • @Jon,如果我理解正确的话,对于对象,有机会按照 where 子句的顺序进行优化(在 SQL 中不存在,因为优化器会为你这样做)?我想在 LINQ-to-Entities 中优化也由后端处理?
  • @ekkis:是的;如果您放置一个廉价的过滤器,首先去除大多数候选元素,那将大大加快速度。
  • @Jon,对于那些更习惯于使用优化器的人来说,知道这真的很有用。谢谢! (你得到一个上升)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多