2016-12-21 3 views
2

実行時にエンティティフレームワークの式を作成していますが、子ICollectionからプロパティを選択する以外のすべての問題を解決しました。Expression.Callメソッド 'Select'が型System.Collections.Generic.ICollectionに存在しません。

私の全体のフレームワークを投稿することは難しいですが、ここで私が試したことはあります。

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

この行は、エラーをスローします。

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

これはエラーです。

ない方法 '選択' タイプ 上に存在する「System.Collections.Generic.ICollection`1 [ApplicationUserRole]

これは私が動的に生成しようとしていますものです。

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

私は助けてくれる人に感謝します。

+3

選択からラムダ表現されているので、あなたは、リフレクションを持つオブジェクトの上にそれを直接呼び出すことはできません。 参照:http://stackoverflow.com/questions/1452261/how-do-i-invoke-an-extension-method-using-reflection –

答えて

3

すでにコメントに記載されているように、SelectはIColletionのメソッドではありません。これは拡張メソッドで、ICollectionから直接Selectを呼び出すことができませんでした。あなたに作成することができ

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

とあなたの式:あなたはMethodInfoこの方法をSelectを作成することができ

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

重要である、Expression.Callの最初のパラメータがnullの場合、Selectは静的な拡張機能ですメソッドであり、呼び出すインスタンスはありません。

lambdaのhierはSystem.Linqの名前空間の拡張メソッドあなたの財産式

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

私はラムダに立ち往生しています。私はparamが何であるか分からない。私はこのExpression.Lambda(property、(MemberExpression)innerProperty)を含む多くのものを試しました。 – MIKE

+0

入手しました。本当にありがとう! var lambda = Expression.Lambda((MemberExpression)innerProperty、innerParam); – MIKE

関連する問題