【发布时间】:2012-03-07 18:05:27
【问题描述】:
我有代码
public static class PredicateExtensions
{
public static Expression<Func<T, bool>> True<T>() { return f => true; }
public static Expression<Func<T, bool>> False<T>() { return f => false; }
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
{
var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>(Expression.Or(expression1.Body, invokedExpression), expression1.Parameters);
}
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
{
var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);
}
}
如何使用此代码代替 LINQ Union 和 Intersect 方法?
【问题讨论】:
-
这是众所周知的谓词构建器——它的存在是为了方便
.Where子句的组合。它与Union或Intersect无关——像往常一样使用这些方法。 -
我得到了一个提示:“使用类似
var predicate = PredicateExtensions.False <Customer> ();predicate = predicate.Or (p => p.CustomerID.Contains ("N"))的东西,相应地,将“Union”替换为“Or”和“And”处的“Intersect”。” -
那个提示对我来说毫无意义。
Union和Intersect是对序列进行操作的集合操作。 PredicateBuilder 的And和Or是对谓词进行操作的布尔运算。他们真的没有任何关系。
标签: linq expression