Bauen IQueryable.Alle mit Expression-Trees für LINQ-Abfragen
Ich Baue eine SQL "WHERE" - Klausel, die dynamisch mit dem System.Linq -.Ausdrücke.Ausdruck-Klasse. Es funktioniert gut für einfache Klauseln, z.B. um "PhaseCode = X" - Klausel, ich Tue das folgende:
var equalTarget = Expression.Constant(phaseCode, typeof(int?));
var phaseEquals = Expression.Equal(Expression.PropertyOrField(projParam, "PhaseCode"), equalTarget);
Aber jetzt versuche ich, um einen Ausdruck zu erstellen, der liefert den Datensatz, wenn ein Projekt zugewiesen wurde, um eine bestimmte Gruppe. Projekt und die Gruppe hat viele-zu-viele-Beziehung.
Ohne den Ausdruck Bäume, ich würde es machen wie folgt:
db.Projects.Where(p => .... && p.GroupsAssigned.Any(g => g.ID == groupId))
Aber ich kann nicht scheinen, um einen Weg zu finden, um auszudrücken, dass mit dem Ausdruck Klasse.
Es gibt eigentlich zwei Dinge, die ich nicht herausfinden können:
- Wie die traverse von Beziehungen zwischen Tabellen
- Wie x zu tun.Jede()
Jede Hilfe wird sehr geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aufruf einer extension Methode, wie Enumerable.Jeder oder Queryable.Jeder, ist einfach eine statische Methode aufrufen, die auf der Reihenfolge und der lambda-Ausdruck, den Sie erstellt für die
WHERE
- Klausel. Sie könnenAusdruck.Rufen Sie
um dies zu tun:Für
Queryable.Any<T>
haben, müssen Sie diese Rolle bis in eine Methode:Obwohl dies scheint seltsam, dass Sie nicht in der Lage bist, dies zu tun durch eine normale Abfrage.
typeof(Queryable).GetMethods("Any").Single(mi => mi.GetParameters().Count() == 2);
Statt:typeof(Enumerable).GetMethods("Any").Single(mi => mi.GetParameters().Count() == 2);