【问题标题】:How to use Expression for Linq union and intersect?如何使用表达式进行 Linq 联合和相交?
【发布时间】: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 子句的组合。它与UnionIntersect 无关——像往常一样使用这些方法。
  • 我得到了一个提示:“使用类似var predicate = PredicateExtensions.False &lt;Customer&gt; ();predicate = predicate.Or (p =&gt; p.CustomerID.Contains ("N")) 的东西,相应地,将“Union”替换为“Or”和“And”处的“Intersect”。”
  • 那个提示对我来说毫无意义。 UnionIntersect 是对序列进行操作的集合操作。 PredicateBuilder 的AndOr 是对谓词进行操作的布尔运算。他们真的没有任何关系。

标签: linq expression


【解决方案1】:

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

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

然后union 将具有predicate0predicate1 为真的值,而inter 将具有predicate0predicate1 为真的值。

出于这个原因,以下将产生相同的结果:

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));

那么很可能谓词甚至不是同一类型,还有其他情况下,组合谓词无法替代UnionIntersect

就人们对谓词、联合和交集如何工作的理解而言,能够以两种方式考虑第一个示例虽然很有用。

【讨论】:

    猜你喜欢
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    相关资源
    最近更新 更多