La risposta contrassegnata lo rende un po 'impreciso.
Come detto @Philippe, il primo sarà tradotto in:
objectList.Where(o => o.value1 < 100).Where(o=> o.value2 > 10)
mentre il secondo sarà tradotto in:
objectList.Where(o => o.value1 < 100 && o.value2 > 10)
MaLinq
ha una poca ottimizzazione per le chiamate con catena Where
.
Se si controlla Linq's
codice sorgente verrà visualizzato il seguente:
class WhereEnumerableIterator<TSource> : Iterator<TSource>
{
public override IEnumerable<TSource> Where(Func<TSource, bool> predicate)
{
return new WhereEnumerableIterator<TSource>(source,
CombinePredicates(this.predicate, predicate));
}
}
Cosa CombinePredicates
non c'è sta combinando i due predicati con &&
tra di loro:
static Func<TSource, bool> CombinePredicates<TSource>(Func<TSource, bool> predicate1,
Func<TSource, bool> predicate2)
{
return x => predicate1(x) && predicate2(x);
}
Quindi objectList.Where(X).Where(Y)
equivale a objectList.Where(X && Y)
fatta eccezione per il tempo di creazione della query (che è comunque estremamente breve) e l'invocazione di due predicati.
linea di fondo è che esso non filtro o iterare la raccolta due volte - ma una volta composito.
fonte
2016-09-21 07:50:26
In realtà è abbastanza impreciso. Se ispezionerai le fonti di 'Linq' vedrai che' Where' ha un metodo che traduce '.Where (x) .Where (y)' in '.Where (x && y)'. [fonte] (http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,f7e72dc9c9621f30) –
Buon punto, non sono in grado di dire se l'ho verificato nel 2009 o se fosse stato vero tutto il tempo. – Philippe