2011-01-19 18 views
18

Mi chiedo se ci sono implicazioni di prestazioni di più dichiarazioni .Where(). Per esempio potrei scrivere:Esistono più istruzioni .Where() in LINQ un problema di prestazioni?

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

Oppure, in alternativa io li potevo combinare in quella clausola Where(), in questo modo:

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

fa la catena di Dove() clausole di compromettere le prestazioni o sono loro equivalenti?

+0

Penso LINQ compila sia ad una simile espressione, a prescindere da come si costruisce (finché non si chiama ToList() o l'ordinamento da qualche parte tra 'Where's) – sinelaw

risposta

16

In LINQ to Objects, ci sarà un colpo di prestazioni molto piccolo, perché in pratica la catena di iteratori sarà più lunga - il recupero del prossimo elemento significa andare su una lunga catena di chiamate MoveNext().

In LINQ to SQL e provider simili, mi aspetto che lo stesso SQL venga generato in entrambi i modi, quindi non influirebbe sulle prestazioni in tale ambito.

EDIT: Dopo aver scritto questo ho trovato un po 'di più sul LINQ to Objects realizzazione - è un little more complicated ...

+0

Allright. Grazie mille. Non so se l'esempio è il migliore, ma a volte penso che troverò più facile leggere e comprendere alcune query se concatenamento in più di istruzioni che non hanno nulla a che fare l'un l'altro./John – John

+0

@Jon, se ho capito bene allora, per gli oggetti c'è la possibilità di ottimizzazione secondo l'ordine delle clausole where (che in SQL non esiste poiché l'ottimizzatore lo fa per te)? Immagino in LINQ-to-Entities che l'ottimizzazione sia gestita anche dal back-end? – ekkis

+2

@ekkis: Sì; se metti un filtro economico che elimina prima la maggior parte degli elementi candidati, ciò accelera molto le cose. –