IQueryable . Wo befindet sich der passende Ausdruck in wo?

Ich habe sehr wenig Erfahrung mit Expressions in .NET, deshalb frage ich Sie lieber. Wie soll ich – siehe Kommentar unten:

 using P = Myclass; .. System.Linq.Expressions.Expression<Func

> myExpression = null; .. myExpression1 = x => foo1 == true && foo2 == false; myExpression2 = x => ... ; .. BinaryExpression resultExpression = System.Linq.Expressions.Expression.OrElse(myExpression1, myExpression2); .. IQueryable

l = l.Where(?resultExpression?); // how to transform BinaryExpression to the suitable type?

Vielen Dank

Sie können auf diese Weise nicht gemeinsam Lambdas “ODER” machen. Sie möchten wirklich die Lambda-Körper zusammen “ODER”. Hier ist eine Methode, dies zu tun:

 public static Expression> OrTheseFiltersTogether( this IEnumerable>> filters) { Expression> firstFilter = filters.FirstOrDefault(); if (firstFilter == null) { Expression> 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> result = Expression.Lambda>(body, param); return result; } 

Dann später:

 Expression> myFilter1 = x => foo1 == true && foo2 == false; Expression> myFilter2 = x => ... ; .. List>> filters = new List>>(); filters.Add(myfilter1); filters.Add(myfilter2); .. Expression> resultFilter = filters.OrTheseFiltersTogether(); IQueryable

query = query.Where(resultFilter);

Vielleicht möchten Sie einen kurzen Blick auf den Predicatebuilder casting:

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

Mit dem Predicatebuilder können Sie einige sehr mächtige Ausdrücke (UND / ODER / NICHT usw.) auf eine saubere und leicht verständliche Weise ausführen. Für einfache Ausdrücke rolle ich sie natürlich einfach von Grund auf und wende sie an, aber für das komplexe Zeug …

Ich bin ein ziemlicher Fan davon 🙂

ein paar Links zu SO selbst, die hilfreich sein können:

LINQ to SQL PredicateBuilder

Generiertes SQL mit PredicateBuilder, LINQPad und Operator ANY

.Where Methode einen Lambda-Ausdruck als Parameter verwendet, müssen Sie Ihre BinaryExpression auf eine vollständige LambdaExpression .

 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()); 

Es ist eine Kombination aus zwei Func

auf Ausdrucksebene.

Ein weniger schicker Weg, das Gleiche zu tun, sollte sein:

 Func

myExpression1 = x => foo1 == true && foo2 == false; Func

myExpression2 = x => ... ; IQueryable

l = l.Where((p) => myExpression1(p) || myExpression2(p));