2011-01-19 15 views
18

Zastanawiam się, czy istnieją implikacje wydajności wielu instrukcji .Where(). Na przykład można napisać:Czy wiele instrukcji .Where() w LINQ jest problemem z wydajnością?

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

Lub alternatywnie mogę połączyć je wszystkie w jednym przypadku() klauzuli, tak:

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

Czy łańcuch gdzie() klauzule zranić wydajności lub są są równoważne?

+0

myślę LINQ kompiluje zarówno do podobnej ekspresji, niezależnie od tego, jak go zbudować (o ile nie nazwiesz ToList() lub sortowania gdzieś pomiędzy "Gdzie jest" – sinelaw

Odpowiedz

16

W LINQ to Objects wystąpi bardzo mały hit wydajnościowy, ponieważ zasadniczo łańcuch iteratora będzie dłuższy - pobranie następnego elementu oznacza przejście do długiego łańcucha wywołań MoveNext().

W LINQ do SQL i podobnych dostawców, oczekiwałbym, że ten sam SQL będzie generowany w obie strony, więc nie wpłynie to na wydajność tam.

EDIT: Od pisania tego znalazłem się nieco więcej o LINQ do realizacji obiektów - jest to little more complicated ...

+0

W porządku. Dziękuję Ci bardzo. Nie wiem, czy ten przykład jest najlepszy, ale czasami wydaje mi się, że łatwiej będzie mi czytać i rozumieć pewne pytania, jeśli połączę kilka stwierdzeń, które nie mają ze sobą nic wspólnego./John – John

+0

@Jon, jeśli dobrze cię rozumiem, w przypadku obiektów istnieje szansa na optymalizację zgodnie z kolejnością klauzul where (która w SQL nie istnieje, skoro optymalizator robi to za Ciebie)? Wyobrażam sobie w LINQ-to-Entities, że optymalizacja jest również obsługiwana przez back-end? – ekkis

+2

@ekkis: Tak; jeśli umieścisz tani filtr, który najpierw pozbywa się większości elementów kandydujących, przyspieszy to znacznie. –

Powiązane problemy