2017-01-15 4 views
3

、私は.Where({"Doe", "Don", "Donna"}.Contains(x.LastName))のようなものを変換するにはどうすればよいアレイ

は、私がどのように私は動的に、上記のように、有効なBinaryExpressionを構築しない、だから、基本的に配列{"Doe", "Don", "Donna"}とメンバー式x.LastName与え

.Where(x => x.LastName == "Doe" || x.LastName == "Don" || x.LastName == "Donna") 

にこの.Contains式を変換する必要がありますか?

これはちょっとした背景ですが、NoSQLデータベースへのLINQインターフェイスを構築しようとしていますが、これはどのように対処するかわかりません。Enumerable.ContainsMemberCallExpressionです。だから私はそのEnumerable.Containsを、データベースが扱える簡単なOrElse式に変換しようとしています。

私はMemberCallExpressionArguments[0]からx.LastNameを得ることができる、と私は定数を列挙し、

を言って、外の List<BinaryExpression>を構築することができたことを、式から定数の列挙を取得する方法を考え出しました
Expressions.Add(Expression.Equal(node.Arguements[0], Expression.Constant(item))); 

どのように私はBinaryExpression秒のリストを取り、フォームExpressions[0] OrElse Expressions[1] OrElse Expressions[2]の有効BinaryExpressionを構築します。

私が試した:

BinaryExpression expression = Expressions[0]; 
for (var idx = 1; idx < Expressions.Count - 1; idx++) 
{ 
    expression += Expression.OrElse(Expressions[idx], Expressions[idx +1]); 
} 

をしかし+=BinaryExpression上で有効ではありません。

.Where(lambda); 

答えて

0

を、私は将来のために私の前の答えを残しておきます。そして、私はその後、あなたが.Where()にそれを養うことができます...

+0

ありがとう、それは次のようになります。あなたはそのためExpression.OrElse方法を使用する必要があります、Expressions.Count - 1.ではなく、実際には式がローカル変数であるため、代わりに式でなければなりません。しかし、これは私の問題を解決しました。また、私のコードを分かりやすくするためにGSergに感謝したい。 –

+0

@ H.D.Hを受け入れていただきありがとうございます。このバンプは500ポイントの評判以上になり、より多くの特権を開くことができます:) –

+0

私の喜び、Tsahiアッシャー、あなたはほとんど表現を簡単に見せます。私はどれくらい近くにいるのかちょっと恥じていて、まだ助けを求めなければならなかった。 –

0
string[] arr = {"Doe", "Don", "Donna"}; 
BinaryExpression exp = null; 
MemberExpression member = ... //get the "x.LastName" expression 
foreach (String name in arr) { 
    BinaryExpression eq = Expression.Equal(member, name); 
    if (exp == null) { 
     exp = eq; 
    } 
    else { 
     exp = Expression.OrElse(exp, eq); 
    } 
} 

Type delegateType = typeof(Func<T, bool>); //T is your entity type, e.g. Person 
ParameterExpression arg = ... //the "x" in "x.LastName" 

//construct the lambda expression x => [expr]. 
LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg); 

実際に既存のBinaryExpressionを上に別のバイナリ表現を追加する方法がわかりませんよ私は表現の構築が容易ではないので、例が誰かにとって有用であると思うからです。問題に関しては、連鎖式は非常に簡単です。 IDX

BinaryExpression expression = Expressions[0]; 
for (var idx = 1; idx < Expressions.Count - 1; idx++) 
{ 
    expression = Expression.OrElse(expression, Expressions[idx]); 
}