如何使用Expression for Linq union和intersect?

时间:2012-03-07 18:05:28

标签: linq expression

我有代码

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方法?

1 个答案:

答案 0 :(得分:0)

如果你有一个联合和形式的交集:

var union = source.Where(predicate0).Union(source.Where(predicate1));
var inter = source.Where(predicate0).Intersect(source.Where(predicate1));

然后union将包含predicate0predicate1为真的值,而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} }。

根据对谓词,联合和交叉如何运作的理解,能够从两个方面考虑第一个例子是有用的。