Ich bevorzuge die Verwendung von Erweiterungsmethoden für die grundlegenden LINQ-Operationen: Where()
, Select
, aber für komplexe Select()
, SelectMany()
und speziell OrderBy().ThenBy()
Anweisungen finde ich die Abfragesyntax viel besser lesbar und natürlich.
Heute habe ich mich mit der folgenden Frage gefunden:
%Vor%Ist es (aus Gründen der Lesbarkeit, Wartbarkeit oder aus irgendeinem anderen Grund) gefährlich, die Syntax von Abfragen und Erweiterungen zu kombinieren?
Das hat das Potenzial, sehr subjektiv zu sein, wenn es so ist, tut es mir leid, wenn es die Voraussetzungen für eine gute subjektive Frage nicht erfüllt. Lass es mich wissen, wenn ich es verbessern kann!
Ist es (aus Gründen der Lesbarkeit, Wartbarkeit oder aus irgendeinem anderen Grund) gefährlich, die Syntax von Abfragen und Erweiterungen zu kombinieren?
Die größte Gefahr, die ich sehen könnte, ist die mögliche Hinzufügung von "Überraschung" in Ihrem Code, besonders wenn Sie von anderen Entwicklern gesehen werden.
Aus Kompilierungssicht wird die Abfragesyntax direkt in die Aufrufe der Erweiterungsmethode übersetzt, so dass hier nicht notwendigerweise ein technisches Problem vorliegt. Dies wird jedoch möglicherweise zusätzliche Methodenaufrufe hinzufügen, die auf den ersten Blick von vielen Entwicklern nicht erwartet werden. Dieses könnte zu einem potenziellen Wartungsproblem führen.
Wenn ich das sparsam und aus gutem Grund getan habe, habe ich nicht das Gefühl, dass es ein echtes Problem beim Mischen der Syntax gibt. Dies ist tatsächlich ziemlich üblich - wenn Sie beispielsweise in die Abfragesyntax schreiben möchten, diese aber vollständig auswerten müssen, wird sie oft in Klammern mit .ToList () hinzugefügt - oder wenn Sie PLINQ mit der Abfragesyntax verwenden möchten, ist es oft from x in collection.AsParallel()
, das ist auch eine technische Mischsyntax ...
Dies ist eine Art Urteilsspruch, aber viele "Best Practice" -Typ-Fragen sind in der Regel, zumindest auf den ersten. Meiner Meinung nach sollten Sie das eine oder andere in einer einzigen Aussage verwenden. Nicht wirklich wegen irgendeiner "Gefahr", die dem Mischen innewohnt, sondern aus Gründen der Klarheit.
In diesem speziellen Fall ist die where-Klausel sehr einfach, und ich würde sie in die Abfragesyntax umwandeln.
Es gibt jedoch Fälle, die in der Abfragesyntax nicht elegant ausgedrückt werden können. In Fällen, in denen es einfach unvermeidlich ist, Syntaxen zu mischen, wären die Abfragen (wiederum IMO) besser lesbar, wenn Sie die Methodenkette in eine eigene Variable aufteilen und dann einfach auf diese Variable in der Abfrage-Syntaxanweisung verweisen. Verwenden Sie Ihre als Modell:
%Vor%Ich denke nicht, dass es gefährlich ist, etwas zu mischen, es hängt davon ab, was lesbarer ist, die Abfragesyntax ist sehr gut lesbar, aber nicht so flexibel, so dass das Mischen von Verkettungen wie ein kleiner Preis erscheint. Ich schätze, die Antwort ist, ob du denkst, dass das Folgende vollgekettet lesbarer ist als das, was du geschrieben hast, ich persönlich denke, dass es leichter zu lesen ist.
%Vor%Nachdem ich das selbst gemacht habe (obwohl nicht für .Where, aber für .Cast) würde ich sagen, es hängt sehr davon ab, welche Erweiterungsmethoden Sie aufrufen.
z.B. Ich fühlte mich vollkommen berechtigt, .Cast zu verwenden, weil es im syntaktischen Zucker (AFAIK) nicht verfügbar war, aber wahrscheinlich vermeiden würde. Wo, denn das hat eine Darstellung in der Abfragesyntax.
Having said that, würde ich wahrscheinlich. Wählen, um Daten in einer Abfrage zu mutieren ... Aber ich bin ein bisschen ein Sadist.