LINQ ist eine der größten Verbesserungen von .NET seit Generika und spart mir jede Menge Zeit und Codezeilen. Die fließende Syntax scheint mir jedoch viel natürlicher zu sein als die Syntax des Abfrageausdrucks.
var title = entries.Where(e => e.Approved)
.OrderBy(e => e.Rating).Select(e => e.Title)
.FirstOrDefault();
var query = (from e in entries
where e.Approved
orderby e.Rating
select e.Title).FirstOrDefault();
Gibt es einen Unterschied zwischen den beiden oder gibt es einen besonderen Vorteil von einem gegenüber dem anderen?
Antworten:
Beides ist nicht besser: Sie dienen unterschiedlichen Bedürfnissen. Die Abfragesyntax kommt zur Geltung, wenn Sie mehrere Bereichsvariablen nutzen möchten . Dies geschieht in drei Situationen:
Hier ist ein Beispiel (aus den LINQPad-Beispielen):
Vergleichen Sie dies nun mit der gleichen Methode in der Methodensyntax:
Die Methodensyntax hingegen bietet die gesamte Bandbreite der Abfrageoperatoren und ist bei einfachen Abfragen präziser. Sie können das Beste aus beiden Welten herausholen, indem Sie die Abfrage- und Methodensyntax mischen. Dies geschieht häufig in LINQ to SQL-Abfragen:
quelle
Ich bevorzuge die Verwendung der letzteren (manchmal als "Abfrageverständnis-Syntax" bezeichnet), wenn ich den gesamten Ausdruck auf diese Weise schreiben kann.
Sobald ich (Klammern) und hinzufügen muss
.MethodCalls()
, ändere ich.Wenn ich die erstere verwende, setze ich normalerweise eine Klausel pro Zeile wie folgt:
Ich finde das etwas leichter zu lesen.
quelle
Jeder Stil hat seine Vor- und Nachteile. Die Abfragesyntax ist bei Verknüpfungen besser und verfügt über das nützliche Schlüsselwort let , mit dem das Erstellen temporärer Variablen in einer Abfrage vereinfacht wird.
Fließende Syntax hingegen bietet viel mehr Methoden und Operationen, die durch die Abfragesyntax nicht verfügbar gemacht werden. Da es sich nur um Erweiterungsmethoden handelt, können Sie auch Ihre eigenen schreiben.
Ich habe festgestellt, dass ich jedes Mal, wenn ich mit dem Schreiben einer LINQ-Anweisung unter Verwendung der Abfragesyntax beginne, diese in Klammern setzen und auf fließende LINQ-Erweiterungsmethoden zurückgreifen muss. Die Abfragesyntax verfügt einfach nicht über genügend Funktionen, um sie selbst zu verwenden.
quelle
In VB.NET bevorzuge ich die Abfragesyntax.
Ich hasse es, das hässliche
Function
Schlüsselwort zu wiederholen :Diese nette Abfrage ist meiner Meinung nach viel besser lesbar und wartbar:
Die Abfragesyntax von VB.NET ist außerdem leistungsfähiger und weniger ausführlich als in C #: https://stackoverflow.com/a/6515130/284240
Zum Beispiel diese LINQ to DataSet-Abfrage (Objekte)
VB.NET:
C #:
quelle
Ich verstehe die Abfragesyntax überhaupt nicht. Ich habe einfach keinen Grund dafür. let kann mit .Select und anonymen Typen erreicht werden. Ich denke nur, dass die Dinge mit der "Interpunktion" dort viel organisierter aussehen.
quelle
Die fließende Schnittstelle, wenn es nur ein Wo gibt. Wenn ich eine Auswahl oder Bestellung benötige, verwende ich im Allgemeinen die Abfragesyntax.
quelle
Fließende Syntax scheint in der Tat leistungsfähiger zu sein. Sie sollte auch besser für die Organisation von Code in kleinen wiederverwendbaren Methoden funktionieren.
quelle
Ich weiß, dass diese Frage mit C # gekennzeichnet ist, aber die Fluent-Syntax ist mit VB.NET schmerzhaft ausführlich.
quelle
Ich mag die Fluent-Syntax sehr und versuche, sie zu verwenden, wo ich kann, aber in bestimmten Fällen, zum Beispiel wenn ich Joins verwende, bevorzuge ich normalerweise die Abfragesyntax. In diesen Fällen finde ich es einfacher zu lesen, und ich denke, einige Leute kennen die SQL-ähnliche Abfragesyntax besser als Lambdas.
quelle
Obwohl ich das fließende Format verstehe und mag, habe ich mich aus Gründen der Lesbarkeit vorerst an Query gehalten. Personen, die gerade mit LINQ vertraut gemacht werden, finden es viel angenehmer, Query zu lesen.
quelle
Ich bevorzuge die Abfragesyntax, da ich aus der traditionellen Webprogrammierung mit SQL stamme. Es ist viel einfacher für mich, meinen Kopf herumzuwickeln. Ich denke jedoch, dass ich anfangen werde, das .Where (Lambda) zu verwenden, da es definitiv viel kürzer ist.
quelle
Ich benutze Linq jetzt seit ungefähr 6 Monaten. Als ich anfing, es zu verwenden, bevorzugte ich die Abfragesyntax, da sie T-SQL sehr ähnlich ist.
Aber ich komme jetzt allmählich zu ersteren, da es einfach ist, wiederverwendbare Codestücke als Erweiterungsmethoden zu schreiben und sie einfach miteinander zu verketten. Obwohl ich finde, dass es sehr hilfreich ist, jede Klausel in eine eigene Zeile zu setzen.
quelle
Ich habe gerade die Standards unseres Unternehmens festgelegt und wir erzwingen die Verwendung der Erweiterungsmethoden. Ich denke, es ist eine gute Idee, eine über die andere zu wählen und sie nicht im Code zu verwechseln. Erweiterungsmethoden lesen sich eher wie der andere Code.
Die Verständnissyntax enthält nicht alle Operatoren und verwendet Klammern um die Abfrage und fügt Erweiterungsmethoden hinzu, schließlich bittet mich nur, von Anfang an Erweiterungsmethoden zu verwenden.
Aber zum größten Teil ist es nur eine persönliche Präferenz mit wenigen Ausnahmen.
quelle