我有代码
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方法?
答案 0 :(得分:0)
如果你有一个联合和形式的交集:
var union = source.Where(predicate0).Union(source.Where(predicate1));
var inter = source.Where(predicate0).Intersect(source.Where(predicate1));
然后union
将包含predicate0
或predicate1
为真的值,而inter
将包含predicate0
和{{predicate1
的值1}}是真的。
出于这个原因,以下结果会有相同的结果:
var union = source.Where(predicate0.Or(predicate1));
var inter = source.Where(predicate0.And(predicate1));
这取决于两个Where
查询产生的并集和交集的组件。在喜欢:
var union = source1.Where(predicate0).Select(item => item.ID)
.Union(source2.Where(predicate1).Select(item => item.ID));
然后,谓词可能不是同一类型,而且还有其他情况,组合谓词不能替代Union
和{{1} }。
根据对谓词,联合和交叉如何运作的理解,能够从两个方面考虑第一个例子是有用的。