Ist es möglich, Teile einer linq Query in eine Funktion zu übergeben? Ich möchte eine gemeinsame Schnittstelle für meine DAL erstellen, die immer die gleiche Query-Schnittstelle verwendet. Zum Beispiel
%Vor%Ist so etwas möglich? Ich denke, es wäre mit Ausdrucksbäumen getan, aber ich konnte keine Beispiele dafür finden.
Nun, das "Join" ist knifflig, weil es sehr schwierig ist, einen Join auszudrücken - aber Dinge wie wo / select / orderby sind ziemlich einfach ...
Wirklich, es ist nur ein Fall der Kombination der verschiedenen LINQ-Methoden auf IQueryable<T>
, die in der Regel Expression<Func<...>>
für eine Kombination akzeptieren. Eine einfache Auswahl mit einem optionalen Prädikat wäre also:
Ich würde auch gerne IQueryable<T>
zurückgeben, da das vollständig zusammensetzbar ist. Wenn der Aufrufer eine Liste haben möchte, kann er immer ToList()
darauf verwenden ... oder (zum Beispiel):
welches (mit Northwind) die Abfrage durchführt:
%Vor%Das Problem mit der "Auswahl" (Projektion) in der Abfrage besteht darin, dass Sie mehrere generische Typen erhalten würden. Da Sie oft möchten, dass die Projektion ein anonymer Typ ist, wäre es dann ziemlich unmöglich, den (anonymen) Projektionstyp und des Tabellentyps anzugeben, und er wäre nicht aufrufbar.
In Wirklichkeit frage ich mich, ob es überhaupt von Vorteil ist, eine solche Methode zu schreiben. Ich könnte einfach bei einer Basismethode bleiben:
%Vor%Und lassen Sie den Anrufer es auf seine bevorzugte Weise zusammenstellen - vielleicht mit der Abfragesyntax:
%Vor%Was verwendet:
%Vor%Alternativ, wenn Sie wirklich die Reihenfolge und Projektion einbeziehen möchten, dann ist eine Erweiterungsmethode der praktikabelste Ansatz; dann müssen Sie nicht das Original (Quelle) T angeben (was es unkündbar macht, wenn es mit anon-Typen gemischt wird):
%Vor%Betrachten Sie dann eine DAL-Methode wie:
%Vor%Was verwendet (wieder mit Northwind):
%Vor%Überprüfen Sie diese generische Klasse: TableView.cs .
Es verwendet grundsätzlich eine Func & lt; TEntity, bool & gt; Delegieren Sie, um das Wo-Prädikat anzuwenden:
%Vor%Sie können die Dynamic Expression-Bibliothek verwenden, die mit Linq Examples zur Verfügung steht. Mit dieser Extension-Bibliothek können Sie linq-Klauseln für wo etc ...
übergebenDownload verfügbar von hier linq-Beispiele
Sie könnten Dynamic LINQ und übergeben Sie die Parameter als Strings.
Marc Gravell ♦ hat wie üblich eine sehr aufschlussreiche Antwort gegeben, aber ich denke wirklich, dass Methoden, die IQueryables verwenden und Einschränkungen hinzufügen, in den meisten Fällen funktionieren und den Code übersichtlicher halten und leicht zu pflegen sind. Zum Beispiel:
%Vor%Dann können Sie diese wie folgt mischen und anpassen:
%Vor%Ich verwende hier Erweiterungsmethoden und NHiberantes LINQ-Bereitstellung Abfrage -Methode, aber dies könnte leicht ohne statische Methoden und mit jedem LINQ-Provider neu geschrieben werden.
Tags und Links c# linq linq-to-sql expression-trees