Wie macht man ein System.Linq -.Ausdrücke.Expression-Objekt mit einem Aufruf an Alle()
Möchte ich dynamisch generieren eine linq.Ausdrücke.Ausdruck-Anweisung, die ich benutzen kann wie ein filter.
Hier ist ein Beispiel von Linq-Abfragen, die ich umwandeln möchte, um einen Ausdruck:
ctx.customer.where(c=>ctx.Invoice.Any(i=>i.customerId == c.id));
Hier ist mein Versuch
using System.Linq.Expressions;
var c = Expression.parameter(typeof(Customer),"c");
var i = Expression.parameter(typeof(Invoice),"i");
var rightPart= Expression.Equal(
Expression.propertyorField(i,"customerId"), Expression.propertyorfield(c,"id")
Bitte helfen.
- Was ist
LinqExpression
? - mit LinqExpression = System.Linq -.Ausdrücke.Ausdruck;
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich manuell anlegen müssen linq-Ausdruck, den ich nur machen .Netto ergeben sich für mich eine solche expression aus lambda-und dann kann ich auch erforschen die Struktur. Zum Beispiel führen Sie unter debug -
und inspizieren Ausdruck variable.
Ich gehe davon aus, dass
LinqExpression
kommt aususing LinqExpression = System.Linq.Expressions.Expression;
.Gibt es keinen bestimmten Ausdruck zu geben für
Any
, denn es ist nicht ein operator oder dergleichen.Any
ist eine statische Methode, so sollten Sie eineCall
Ausdruck dafür.Müssen Sie bauen den Ausdruck auf der Grundlage der statischen Methode syntax anstatt der extension-Methode syntax:
Es gibt viele Schritte zu diesem. Hier ist es gezeichnet, weil ich nicht haben Zeit, um alle Schritte richtig. Ich bin mir nicht ganz sicher, wie Sie Sie darstellen, die Tatsache, dass die
c
parameter verwendet, die in der inneren lambda ist ein parameter der lambda an, sondern auf den äußeren lambda. In der Gliederungsansicht, die Sie benötigen, umEnumerable.Any
Methode.MakeGenericMethod
).ctx.Invoce
)rightPart
in deinem Beispiel code).var innerLambda = Expression.Lambda(rightPart, i);
)Where
(d.h.,Expression.Lambda(methodCallExpression, c)
.Vierten Schritt wird variieren, wenn Sie möchten, kombinieren Sie Boolesche Ausdrücke wie in Ihrem Kommentar.
Ich hoffe, das hilft.
Beachten Sie, dass ich Hinzugefügt habe, innere Ausdruck. Es ist ein bisschen Schließung code, den Sie brauchen, um machen, da Sie über eine variable erfasst.
Hinweis: die Vereinfachung der Möglichkeit, bei der Verwendung von code aus https://stackoverflow.com/a/3472250/90475.
Minimal-code, um die expression-code in DebugView...
Hier ist, was ich sehe, in den Reflektor:
Nah genug für Regierung arbeiten... Das sagt mir, dass es keineswegs trivial, und Sie müssen zur Vereinfachung Ihrer ursprünglichen Abfrage.
Ich würde auch versuchen, LinqPad für das schnelle prototyping
Fügen Sie diesen code:
Dann können Sie
filter
als parameter in einemIQueryable<Customer>.Where
Methode.