2017-02-12 4 views
0

式/述語パラメータが必要なFindAll()というサービスメソッドがあり、一致するすべての行が返されます。類似のオブジェクトのLINQでの動的式

私はBookオブジェクトのコレクションを持っていて、文字列のリストにある名前を持つすべての書籍を取得したいとします。

:私は私のような何かを行うことができますダイナミックな表現を構築したいと思いますので、私はまた、すべての Name性質を持っている他のクラスの数を持っている

var lstNames = { "Book1", "Book2" }; 
var matchedBooks = myService<Book>.FindAll(x => lstNames.Any(y => x.Name.Equals(y))); 

:私はこのような何かを持っていると思います

var matchedObjs = myService<T>.FindAll(x => lstNames.Any(y => x.Name.Equals(y))); 

このような動的表現を作成するにはどうすればよいですか?この回答へ

+1

インターフェイスを使用するか、ダイナミック変数 – Jbjstam

+0

のいずれかを使用しないでください。 EFはこれらのクラスを生成しますが、可能であればインタフェースを追加したくありません。動的な表現を作成するのが最もクリーンな方法です。 – notlkk

+0

'Where'ではなく' FindAll'を使用している理由は何ですか? – Abion47

答えて

0

ありがとう:.Contains()のために

static Expression<Func<T, bool>> GetExpr<T> (string name, string value) 
{ 
    ParameterExpression param = Expression.Parameter(typeof(T), "x"); 
    Expression prop = Expression.Property(param, name); // this is the property name, e.g. .Name 
    Expression<Func<string>> valueLambda =() => value; // This is the value for == expression. 
    Expression lookupExpression = Expression.Equal(prop, valueLambda.Body); 

    Expression<Func<T, bool>> expr = Expression.Lambda<Func<T, bool>>(lookupExpression, param); 

    return expr; 
} 

...または、::How to declare a Linq Expression variable in order to have it processed as a dbParameter

は、私はあなたがこれを行う提案

static Expression<Func<T, bool>> GetExprContains<T>(string name, string[] value) 
{ 
    ParameterExpression param = Expression.Parameter(typeof(T), "x"); 
    Expression prop = Expression.Property(param, name); // this is the property name, e.g. .Name 
    Expression<Func<string[]>> valueLambda =() => value; // This is the value for .Contains() expression. 
    var mi = 
    typeof(Enumerable).GetMethods(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public) 
     .FirstOrDefault(x => x.Name == "Contains" && x.GetParameters().Count() == 2) 
     .MakeGenericMethod(typeof(string)); // Need methodinfo for .Contains(), might want to keep static somewhere 
    var lookupExpr = Expression.Call(null, mi, valueLambda.Body, prop); 

    Expression<Func<T, bool>> expr = Expression.Lambda<Func<T, bool>>(lookupExpr, param); 

    return expr; 
} 

検査済み、EFで動作します。

関連する問題