Ok ecco i miei risultati dopo aver passato l'uscita Reflector per un po '. LINQ to Objects combinare i consecutivi where
predicati quando si utilizza WhereArrayIterator
o WhereListIterator
inducendolo a QUASI comportarsi come & & operatore, ma non come esattamente:
Quando si utilizza x.a==1 && x.b==1
la clausola WHERE si traduce in un Func<TSource, bool>
simile a questo:
bool daspredicate(TSource x)
{
return x.a==1 && x.b==1
}
Tuttavia, quando si utilizzano clausole Where consecutive c'è una leggera penalizzazione delle prestazioni, almeno dall'aspetto IL non JITted.Ecco come il codice si presenta come dopo la combinazione:
bool predicate1(TSource x)
{
return x.a==1;
}
bool predicate2(TSource x)
{
return x.b==1;
}
bool daspredicate(TSource x)
{
return predicate1(x) && predicate2(x);
}
Come si può vedere si tratta di un ulteriore sovraccarico funzione di chiamata. Questo può essere piuttosto costoso a meno che JIT non indichi le funzioni. Sono sicuro che fa un buon lavoro ma ora sappiamo che il lavoro di JIT diventa molto più facile se uniamo le nostre dichiarazioni Where, a meno che non sia necessario.
Sul lato SQL, tuttavia, le query sono le stesse. Anche prima dell'esecuzione, il debugger valuta l'oggetto query nella stessa istruzione SQL. Non potevo andare troppo lontano nello spazio dei nomi di Linq perché le cose sembravano molto più complesse, ma poiché le query sono le stesse, non dovrebbe esserci alcuna penalità diversa dall'esempio LINQ-to-objects sopra.
MODIFICA: ho visto le istanze in cui più istruzioni in cui risultano sottospecifiche annidate su server SQL. Penso che sia meglio attenersi al singolo in cui le dichiarazioni ogni volta che si può essere dalla parte della sicurezza.
fonte
2009-11-08 14:35:00
quasi duplicato di http://stackoverflow.com/questions/1648730/when-using-linq-what-is-the-difference-between-and-multiple-where-clauses –
Non l'ho trovato nel mio ricerca ma questo è specifico LINQ-to-SQL. –
l'impatto su LINQ-to-Objects sarebbe ovvio, tuttavia LINQ-to-SQL non è chiaro. –