2011-01-19 74 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