2012-03-07 26 views
3

我有代碼如何使用Linq表達式和相交?

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聯盟和Intersect方法呢?

+1

這是衆所周知的謂詞構建器 - 它的存在是爲了方便構成'.Where'子句。它與'Union'或'Intersect'無關 - 按照通常的方式使用這些方法。 – 2012-03-07 18:14:21

+1

我收到了一條提示:「使用類似 'var predicate = PredicateExtensions.False ();' 'predicate = predicate.Or(p => p.CustomerID.Contains(」N「))' 相應地, 「聯盟」由「或」替換爲「和」的「相交」。「 – BILL 2012-03-07 18:22:00

+1

那暗示對我沒有意義。 「聯合」和「交集」是對一個序列進行操作的設置操作。 PredicateBuilder的'And'和'Or'是操作謂詞的布爾操作。他們真的沒有任何關係。 – 2012-03-07 18:26:37

回答

0

如果你有以下形式的聯合和交集:

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工作。

從人們對謂詞,工會和交叉口的工作方式的理解方面來看,能夠從兩個方面考慮第一個例子雖然很有用。