我假设查询的不同部分仅在运行时才知道,即您不能只使用||
in a where
...
一种懒惰的选择是Concat
- 但这往往会导致 TSQL 等性能不佳;但是,我倾向于编写自定义的Expression
代替。采取的方法取决于提供程序是什么,因为 LINQ-to-SQL 支持 EF 的不同选项(例如) - 这在这里具有真正的影响(因为您不能在 EF 中使用子表达式)。你能告诉我们是哪一个吗?
下面是一些应该与 LINQ-to-SQL 一起使用的代码;如果你构建一个数组(或列表,并调用.ToArray()
) 的表达式,应该可以正常工作;示例是 LINQ-to-Objects,但应该仍然有效:
static void Main()
{
var data = (new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }).AsQueryable();
var predicates = new List<Expression<Func<int, bool>>>();
predicates.Add(i => i % 3 == 0);
predicates.Add(i => i >= 8);
foreach (var item in data.WhereAny(predicates.ToArray()))
{
Console.WriteLine(item);
}
}
public static IQueryable<T> WhereAny<T>(
this IQueryable<T> source,
params Expression<Func<T,bool>>[] predicates)
{
if (source == null) throw new ArgumentNullException("source");
if (predicates == null) throw new ArgumentNullException("predicates");
if (predicates.Length == 0) return source.Where(x => false); // no matches!
if (predicates.Length == 1) return source.Where(predicates[0]); // simple
var param = Expression.Parameter(typeof(T), "x");
Expression body = Expression.Invoke(predicates[0], param);
for (int i = 1; i < predicates.Length; i++)
{
body = Expression.OrElse(body, Expression.Invoke(predicates[i], param));
}
var lambda = Expression.Lambda<Func<T, bool>>(body, param);
return source.Where(lambda);
}