2013-03-31 7 views
7

Ich gehe einige LINQ-Beispiele aus einem Buch über MVC durch und frage mich, welchen Zweck die Auswahl unten haben könnte. Vielleicht ist es ein Tippfehler, aber ich sehe keine Erwähnung in den Errata des Buches.Möglicher Zweck der LINQ-Auswahl (x => x)

foreach(Product p in products 
    .Where(e => e.Name == productParam.Name) 
    .Select(e => e)) { 
     p.Price = productParam.Price; 
} 

Getestet habe ich aus zwei Beispiele dafür, wo die .Select (e => e) enthalten war und eine, wo es nicht und der Code war die gleiche ist. Da Where das durch das Prädikat gefilterte IEnumerable zurückgibt, wann wäre dann der select-Aufruf (mit dem spezifischen Prädikat oben) jemals notwendig? Macht es tatsächlich etwas? Könnte es in einem komischen Fall sein?

+0

Ich denke nur, wenn Sie die generischen Argumente explizit definiert haben und der Rückgabewert ein implizit konvertierbarer Wert aus der Quelle war. Sie könnten auch Breakpoints für das Debugging plausibel einbeziehen (vielleicht würden Sie dafür geschweifte Klammern und eine neue Zeile benötigen). Aber außer diesen (vor allem, da keiner von beiden tatsächlich in dem von Ihnen geposteten Code vorkommt), kann ich mir keinen sinnvollen Zweck dafür vorstellen. Vielleicht eine faule Umwandlung der Linq-Abfragesyntax? –

+0

Dies ist eigentlich ein häufiger Fehler. Noch üblicher ist es, ToList auf alles zu schlagen. Leute verstehen das Ausführungsmodell von LINQ-Abfragen im Allgemeinen nicht (was verständlich ist). – usr

+0

@usr Ich wünschte, es gäbe eine (Standard) 'Force'-Erweiterung, aber es gibt viele Male, wenn eine Bewertung eines IQuerable/IEnumerable erzwungen werden muss, auch wenn Sie * wirklich * an einer Liste nicht interessiert sind. Der Name würde es auch offensichtlicher für die gewünschte Operation machen. –

Antwort

9

Es würde die gleiche Sache wie ohne es, ein IEnumerable<T> zurückgeben. Es tut mehr Schaden als Nutzen, da es eine redundante O (n) -Operation durchführt (durch die ganze Liste).

Referenzen

+1

Nicht genau - es wird IQueryable zurückgeben. Aber sonst bist du richtig, du bekommst dasselbe wie ohne den Select-Ausdruck. – chris

+1

Basierend auf der Definition auf der Enumerable.Select-Referenzseite, die lautet "projiziert jedes Element einer Sequenz in ein neues Formular." und die Tatsache, dass die Projektion die exakt gleiche Form ist, scheint dies zu beweisen, dass es hier keinen Zweck erfüllt. – seangwright

+0

@DanielImms Wenn Produkte ein 'IQueryable' sind, wird der Select-Aufruf bei den meisten Providern als O (1) enden, weil er nichts tut. <- Das ist nur pingelig. Deine Antwort ist gut und ich habe sie aufgewertet. – usr

5

Hat es etwas wirklich tun?

Es fügt Overhead für den gesamten Vorgang hinzu. In Wirklichkeit sollte es entfernt werden, da es keinem nützlichen Zweck dient.

3

Ich denke, der Autor wollte nur zeigen, wie LINQ-Abfragen SQL-Anweisungen sehr ähnlich sind. In diesem Fall wird es eindeutig nicht benötigt, da es die Identitätsfunktion verwendet und weggelassen werden kann. Allerdings ist es erforderlich, die select-Klausel in SQL zu haben. Es ist nicht falsch, es dort zu haben, aber es ist definitiv nicht nötig.

Obwohl ein Identity Select-Aufruf im Allgemeinen nicht immer eine schlechte Sache ist, insbesondere wenn die Abfrage in einer Funktion zurückgegeben wird. Dies kann Ihnen helfen, eine schreibgeschützte Ansicht einer Sammlung anzuzeigen, die Sie zurückgeben möchten. Dies gilt jedoch in diesem Fall nicht, da die Abfrage sofort aufgelistet wird.

Verwandte Themen