2016-01-27 14 views
5

Angenommen, ich etwas tun, wieKann LINQ "Abfragen" optimieren?

var Ordered = MyList.OrderBy(x => x.prop1).ThenBy(x => x.prop2); 

Ist die gefilterte Liste MyList.OrderBy(x => x.prop1) zurückzukehren, und dann filtern ist es ferner, dass die Liste von ThenBy(x => x.prop2)? Mit anderen Worten, ist es äquivalent zu

var OrderedByProp1 = MyList.OrderBy(x => x.prop1); 
var Ordered = OrderedByProp1.OrderBy(x => x.prop2); 

???

Denn natürlich ist es möglich, dies zu optimieren, indem sie einen Sortieralgorithmus mit einem Komparator ausgeführt wird:

var Ordered = MyList.Sort((x,y) => x.prop1 != y.prop1 ? x.prop1 < y.prop1 : (x.prop2 < y.prop2)); 

Wenn es irgendeine Art von Optimierung und Zwischenlisten tut nicht in den Prozess zurückgeführt, dann, wie es weiß wie geht das? Wie schreibt man eine Klasse, die Ketten von Methoden auf sich selbst optimiert? Macht keinen Sinn.

+0

Welcher Geschmack von LINQ? LINQ zu Objekten, LINQ zu Entitäten, usw.? –

+0

Und wenn Linq an Entitäten, die Linq Anbieter? Da sind viele. Beachten Sie, dass es in EF7 Änderungen gibt, die es Linq für Entitätsanbieter erleichtern, Abfragen besser zu optimieren. –

+0

Wenn Sie eine Verbindung zu einer Datenbank herstellen, verwenden Sie den SQL Profiler, um die in jedem Fall generierten Datenbankabfragen zu vergleichen und festzustellen, welche Unterschiede bestehen (falls vorhanden). – ChrisF

Antwort

7

Hat die gefilterte Liste

No. LINQ Methoden (typischerweise mindestens) return abfragt, nicht die Ergebnisse der Ausführung diese Abfragen MyList.OrderBy(x => x.prop1) zurückzukehren.

OrderBy gibt nur ein Objekt zurück, das, wenn Sie nach einem Artikel fragen, den ersten Artikel in der Sammlung bei einer bestimmten Bestellung zurückgibt. Aber bis Sie tatsächlich nach einem Ergebnis fragen, tut es nicht irgendetwas.

Beachten Sie, dass Sie auch eine vernünftige Idee bekommen können, was passiert, wenn Sie nur schauen, was OrderBy zurückgibt. Es gibt IOrderedEnumerable<T> zurück. Diese Schnittstelle verfügt über eine Methode, die CreateOrderedEnumerable:

Führt eine nachfolgende Sortierung auf die Elemente eines IOrderedEnumerable nach einem Schlüssel.

Diese Methode verwendet ThenBy, um anzugeben, dass es eine nachfolgende Bestellung gibt.

Das bedeutet, dass Sie alle die comparers Aufbau sind, die Sie verwendet werden soll, aus dem OrderBy und alle ThenBy Anrufe bevor Sie überhaupt ein einzelnes Element im Ergebnis setzen müssen erzeugen.

Weitere Informationen zu genau Wie Sie dieses Verhalten erstellen können, finden Sie unter Jon Skeet's blog series on the subject.

+0

Auch wenn Jon Skeet eine Frage nicht beantwortet, beantwortet er eine Frage. –