In LINQ to SQL übergeben Sie Teile einer LINQ-Abfrage in eine Funktion

8

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.

    
Arron S 12.01.2009, 04:53
quelle

5 Antworten

10

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:

%Vor%

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):

%Vor%

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%     
Marc Gravell 12.01.2009, 06:25
quelle
2

Ü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%     
CMS 12.01.2009 05:25
quelle
1

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 ...

übergeben

Download verfügbar von hier linq-Beispiele

    
Dincer Uyav 12.01.2009 09:50
quelle
0

Sie könnten Dynamic LINQ und übergeben Sie die Parameter als Strings.

    
Abram Simon 12.01.2009 05:22
quelle
0

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.

    
mayu 04.07.2012 03:03
quelle