2016-08-03 4 views
0

ここでは私の一般的なリポジトリクラスのメソッドです:式リスト<T> .Select(と機能))(含まれてい

public IEnumerable<T> GetBy(Expression<Func<T, bool>> condition) 
    { 
     return Context.Set<T>().Where(condition).ToList(); 
    } 

そして、私は好きで、それを呼び出すようにしたい:

resultCandidate = _repo.GetBy(p => members.Select(s=>s.MemberID).Contains(p.CandidateMemberID)).ToList(); 

しかし、ときに私がしてみてください"StateInfoの定数値を作成できません。プリミティブ型または列挙型のみがこのコンテキストでサポートされています。"

私はそのようなメソッドを呼び出す必要があります。そして、私はcondition.Compile()を試してみましたが、うまくいきました。これは、SQLクエリを生成するときにwhere節を取得しないためです。

注:メンバーがあなたの方法でokですList<MemberInfo>

おかげ

答えて

2

です。それはだ場合、まあ:

var memberIds = members.Select(s=>s.MemberID).ToList(); 
resultCandidate = _repo.GetBy(p => memberIds.Contains(p.CandidateMemberID)).ToList(); 

UPDATE:しかし、あなたは表現の外に会員IDのリストを移動する必要があるので、プリミティブ型リスト要件を満たす、(それは例外メッセージを示すためにしようとしているものです)

using System.Linq.Expressions; 

class ExpandSelectVisitor : ExpressionVisitor 
{ 
    protected override Expression VisitMethodCall(MethodCallExpression node) 
    { 
     if (node.Method.DeclaringType == typeof(Enumerable) && node.Method.Name == "Select") 
      return Expression.Constant(Expression.Lambda(node).Compile().DynamicInvoke()); 
     return base.VisitMethodCall(node); 
    } 
} 

と、このようなあなたの一般的なリポジトリのメソッド内でそれを使用します:

をあなたはまさにそのようにそれを呼び出すようにするために、あなたは非常にナイーブExpressionVisitorを以下試すことができますので、重要な
public IEnumerable<T> GetBy(Expression<Func<T, bool>> condition) 
{ 
    condition = condition.Update(
     new ExpandSelectVisitor().Visit(condition.Body), condition.Parameters); 

    return Context.Set<T>().Where(condition).ToList(); 
} 
+0

はい@IvanStoevは動作します。しかし、私は大きなプロジェクトと私はそれのすべての部分を行うことはできませんので、メソッドで使用する必要があります。それは私が書いたようなはずです – Burcay

+0

残念ながら、現在のEF要件で動作させる方法は他にありません。 –

+0

表現条件は何ですか? 'condition.Compile()'を使用すると実際に動作しますが、私が言ったようにwhere節でコードを生成するのではなく、選択するだけです。 – Burcay

関連する問題