2010-12-13 9 views
3

.NETでExpressionsという非常に低い経験をしています。だから私はあなたに頼んでいます。 にはどうすればいいはずです - 下記のコメントを参照してください: IQueryable <T>。どこで()適切な式?

using P = Myclass; 
.. 
System.Linq.Expressions.Expression<Func<P, bool>> myExpression = null; 
.. 
myExpression1 = x => foo1 == true && foo2 == false; 
myExpression2 = x => ... ; 
.. 
BinaryExpression resultExpression = System.Linq.Expressions.Expression.OrElse(myExpression1, myExpression2); 
.. 
IQueryable<P> l = l.Where(?resultExpression?); // how to transform BinaryExpression to the suitable type? 

はあなたに

+0

これを正しく理解するには - 任意のサイズの式Sのリストを取得し、それらを一緒に構成して、結果が次のようになるようにする:resultExpression = x => S [0](x)|| S [1](x)|| S [2](x)... || S [n](x) 'である。そうですか? –

答えて

5

あなたが一緒にラムダそのようにできない「OR」。あなたは本当にラムダボディを "OR"したいと思っています。ここではそれをする方法があります:

後に続いて
public static Expression<Func<T, bool>> OrTheseFiltersTogether<T>( 
    this IEnumerable<Expression<Func<T, bool>>> filters) 
{ 
    Expression<Func<T, bool>> firstFilter = filters.FirstOrDefault(); 
    if (firstFilter == null) 
    { 
     Expression<Func<T, bool>> alwaysTrue = x => true; 
     return alwaysTrue; 
    } 

    var body = firstFilter.Body; 
    var param = firstFilter.Parameters.ToArray(); 
    foreach (var nextFilter in filters.Skip(1)) 
    { 
     var nextBody = Expression.Invoke(nextFilter, param); 
     body = Expression.OrElse(body, nextBody); 
    } 
    Expression<Func<T, bool>> result = Expression.Lambda<Func<T, bool>>(body, param); 
    return result; 
} 

Expression<Func<P, bool>> myFilter1 = x => foo1 == true && foo2 == false; 
Expression<Func<P, bool>> myFilter2 = x => ... ; 
.. 
List<Expression<Func<P, bool>>> filters = new List<Expression<Func<P, bool>>>(); 
filters.Add(myfilter1); 
filters.Add(myfilter2); 
.. 
Expression<Func<P, bool>> resultFilter = filters.OrTheseFiltersTogether(); 
IQueryable<P> query = query.Where(resultFilter); 
-2

その発現レベル上の2つのFunc<P, bool>の組み合わせをありがとうございました。

でなければなりません同じことを行うにはあまり派手な方法:

Func<P, bool> myExpression1 = x => foo1 == true && foo2 == false; 
Func<P, bool> myExpression2 = x => ... ; 

IQueryable<P> l = l.Where((p) => myExpression1(p) || myExpression2(p)); 
+1

Works for Func Expression >では機能しません。 –

+0

@David B:表現が必要ではないかもしれません。 – VVS

1

あなたはPredicatebuilderでおしっこを見てすることがあります:

http://www.albahari.com/nutshell/predicatebuilder.aspx

Predicatebuilderは、あなたがすることができます非常にクリーンで理解しやすい方法で、非常に強力な表現(AND/OR/NOTなどなど)を実行してください。単純な式のために、私はもちろん、単に最初からそれらをロールバックして適用されますが、複雑なもののため...

私はそれのかなりファンだ:)

SOそのものであってもよいことにいくつかのリンク役立つ:

LINQ to SQL PredicateBuilder

Generated SQL with PredicateBuilder, LINQPad and operator ANY

0

.Whereメソッドは、パラメータとしてラムダ式を取り、あなたは完全な012のおBinaryExpressionを構築する必要があります。

var resultExpression = Expression.OrElse(myExp1, myExp2); 
    // now the exp is like: p > 100 || p < 10 
ParameterExpression parameterExp = Expression.Parameter(typeof(P),"p"); 
    // construct a parameter with its type P, looks like: p => 
LambdaExpression lambdaExp = Expression.Lambda(resultExpression, parameterExp); 
    // merge the two expressions: p => p > 100 || p < 10 
myList.Where(lambdaExp.Compile()); 
関連する問題