2016-12-21 1 views
2

Ich bin Ausdrücke für Entity Framework zur Laufzeit erstellen und ich habe alle Probleme gelöst, außer eine Eigenschaft aus einem Kind ICollection auswählen.Expression.Call Keine Methode 'Select' existiert auf Typ System.Collections.Generic.ICollection

Es ist schwierig, meinen ganzen Rahmen zu veröffentlichen, aber hier ist, was ich versucht habe.

var param = Expression.Parameter(typeof(TEntity), "w"); 
Expression.Property(entity, propertyName); 

w.Roles

var param = Expression.Parameter(typeof(TChild), "z"); 
Expression.Property(entity, propertyName); 

z.ApplicationRole.Name

Diese Leitung führt den Fehler.

Expression.Call(property, "Select", null,(MemberExpression)innerProperty); 

Dies ist der Fehler.

Keine Methode 'Auswählen' existiert auf Typ ‚System.Collections.Generic.ICollection`1 [ApplicationUserRole]

Dies ist, was ich versuche, dynamisch zu erzeugen.

await context.Users.Where(c => c.Roles 
           .Select(x => x.ApplicationRole.Name) 
           .Contains("admin")) 
        .ToListAsync(); 

Ich würde jemanden schätzen, der helfen könnte.

+3

Select ist eine Erweiterungsmethode in System.Linq Namespace, so dass Sie es nicht direkt am Objekt mit Reflexion nennen. Siehe: http://stackoverflow.com/questions/1452261/how-do-i-invoke-an-extension-method-using-reflection –

Antwort

3

Wie bereits im Kommentar erwähnt, Select keine Methode IColletion ist, dann ist es eine Erweiterung Methode und man konnte Select direkt von ICollection nicht aufrufen.

Sie SelectMethodInfo auf diese Weise schaffen könnte:

var selM = typeof(Enumerable) 
     .GetMethods() 
     .Where(x => x.Name == "Select") 
     .First().MakeGenericMethod(typeof(TEntity), typeof(string)); 

und Ihre Expression Sie erstellen können:

var selExpression = Expression.Call(null, selM, param , lambda); 

Wichtig ist, dass der erste Parameter von Expression.Call null ist, ist Select eine statische Dehnung Methode und es muss keine Instanz aufgerufen werden.

lambda hier ist ein lamda Ausdruck von Ihrer Eigenschaft Expression

var prop= Expression.Property(entity, propertyName); 
var lambda = Expression.Lambda(prop, param); 
+0

Ich bin auf der Lamda stecken. Ich weiß nicht, was Param ist. Ich habe viele Sachen einschließlich dieses Expression.Lambda (Eigenschaft, (MemberExpression) innerProperty) versucht; – MIKE

+0

Verstanden. Vielen Dank! var lambda = Ausdruck.Lambda ((MemberExpression) innerProperty, innerParam); – MIKE

Verwandte Themen