Aufrufen der .Any-Erweiterungsmethode mit Entity Framework mithilfe von Ausdrucksstrukturen

c# entity-framework expression-trees

Frage

Ich habe hier ein paar Beispiele für das Aufrufen einer Methode aus einem Ausdruck und auf MSDN angeschaut, aber ich konnte nicht den richtigen Methodenaufruf / Objekttyp für Any () für die folgende Abfrage abrufen. Es scheint mir möglich zu sein, den Aufruf der Eigenschaft, aber nicht IEnumerable Teil der untergeordneten Eigenschaft zu erhalten.
billing_map_set_lu ist das übergeordnete Element von billmaps_lu und ist im Entity Framework als Assoziation definiert.

Der Grund, warum ich Ausdrucksbäume verwende, ist, dass ich in der Lage sein muss, die Abfrage zur Laufzeit mit 1-n. SelectMany (p => p.billmaps_lu) .Where (Prädikat) -Klauseln zu definieren. Also dachte ich, wenn ich die Ausdrucksbäume bauen könnte, könnte ich mit all den verschiedenen Kombinationen umgehen, die ich für dieses System habe, die viele sind.

var myResults = ctx.billing_map_set_lu
                   .Where(p => p.billmaps_lu.Any(b => b.billmap_columnname == "templatesittings_key" &&  b.billmap_columnvalue == 428264))
                                   SelectMany(p => p.billmaps_lu)
                   .Where (b =>b.billmap_columnname =="locations_key" && b.billmap_columnvalue == 12445)
                                   Select(z => z.billing_map_set_lu);

Ich habe ein paar Versuche mit den obigen Beispielen versucht ...

var myResults = ctx.billing_map_set_lu
                   .Where(p => p.billmaps_lu.Any(b => b.billmap_columnname == "templatesittings_key" &&  b.billmap_columnvalue == 428264))
                                   SelectMany(p => p.billmaps_lu)
                   .Where (b =>b.billmap_columnname =="locations_key" && b.billmap_columnvalue == 12445)
                                   Select(z => z.billing_map_set_lu);

Der obige Teil scheint in Ordnung, aber wenn ich versuche, die .Any Es ist wie ich kann nicht die richtige Eigenschaft / Methode, um die richtigen Objekte heraus zu bekommen. (Ich habe das Gefühl, dass ich ein physikalisches Problem habe, wo ich mit den falschen Einheiten arbeite.) Ich hoffe, dass es etwas Einfaches ist, dass ich vermisse. Ich bin ziemlich neu bei Expression Trees. Ich habe nicht funktionierenden Code zum Testen hinzugefügt um dir zu zeigen, wo mein Kopf ist und wie mich jemand in die richtige Richtung lenken kann.

var myResults = ctx.billing_map_set_lu
                   .Where(p => p.billmaps_lu.Any(b => b.billmap_columnname == "templatesittings_key" &&  b.billmap_columnvalue == 428264))
                                   SelectMany(p => p.billmaps_lu)
                   .Where (b =>b.billmap_columnname =="locations_key" && b.billmap_columnvalue == 12445)
                                   Select(z => z.billing_map_set_lu);

Akzeptierte Antwort

Haftungsausschluss, ich habe keinen kompilierten Arbeitscode.

2 Probleme.

Das erste Problem liegt wahrscheinlich in:

ParameterExpression billMapSetParameter = Expression.Parameter(typeof(billing_map_set_lu), "p");

Das ist kein Parameter, den du brauchst:

ParameterExpression billMapSetParameter = Expression.Parameter(typeof(billing_map_set_lu), "p");

Ändern Sie den billMapSetParameter in den billMaps ParamterExpression, dann sollten Sie gut gehen. Sie rufen den PropertyExpression auf, um Ihr billMapSet für Sie von ParameterExpression abzurufen.

2. Problem: (Nicht sicher, aber mein Bauchgefühl) Möglicherweise müssen Sie die Where-Klausel als ConstantExpression mit dem Ausdruck <.Func <>> übergeben. .Jede Methode benötigt zwei Parameter, von denen der zweite ein Ausdruck <.Func <>> ist (oder nur ein Func <>? Kann sich nicht erinnern).

ParameterExpression billMapSetParameter = Expression.Parameter(typeof(billing_map_set_lu), "p");

Dann gib ce wieder in original wo du "myWhereClause1" ist.

Crossfinger funktioniert

Bearbeiten- Schrott, SHOW MI ZEH CODEZ

ParameterExpression billMapSetParameter = Expression.Parameter(typeof(billing_map_set_lu), "p");



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum