2011-01-19 78 views
18

我想知道是否有多个.Where()语句的性能影响。例如,我可以写:LINQ中有多个.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 
       ) 
     ); 

或者我也可以他们都合并到一个地方()子句,像这样:

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 
       ) 
     ); 

请问凡()的条款损害性能的链或有他们相当于?

+0

我认为LINQ编译既相似的表达,不管你如何构建它(只要你不调用ToList()或者在Where' – sinelaw 2011-01-19 13:06:54

回答

16

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

在LINQ to SQL和类似的提供程序中,我希望以同样的方式生成相同的SQL,所以它不会影响那里的性能。

编辑:既然写这个,我发现了更多的关于LINQ到对象实现 - 这是一个little more complicated ...

+0

之间的某种地方进行排序Allright。非常感谢你。我不知道这个例子是否是最好的例子,但有时我认为如果我将几个相互无关的语句连锁起来,我会发现它更容易阅读和理解一些查询。 /约翰 – John 2011-01-19 13:32:36