Для LINQ to SQL или других провайдеров, основанных на запросах, PredicateBuilder
является решением.Он не позволяет вам вызывать Where
несколько раз, но позволяет динамически создавать предикат с использованием нескольких вызовов.
Для LINQ to Objects вы можете создать собственный эквивалент PredicateBuilder
, используя делегаты вместодеревья выражений , как показано в этом ответе .Просто для того, чтобы этот ответ был завершен сам по себе, вот тот же код снова:
public static class DelegatePredicateBuilder
{
public static Func<T, bool> True<T>() { return f => true; }
public static Func<T, bool> False<T>() { return f => false; }
public static Func<T, bool> Or<T>(this Func<T, bool> expr1,
Func<T, bool> expr2)
{
return t => expr1(t) || expr2(t);
}
public static Func<T, bool> And<T>(this Func<T, bool> expr1,
Func<T, bool> expr2)
{
return t => expr1(t) && expr2(t);
}
}
Таким образом, вы бы использовали что-то вроде:
var predicate = DelegatePredicateBuilder.False<string>();
if (someCondition)
{
predicate = predicate.Or(l => l.StartsWith("S"));
}
if (someCondition)
{
predicate = predicate.Or(l => l.EndsWith("u"));
}
query = query.Where(predicate);