2012-03-07 7 views
3

私はコード Expression for Linq unionとintersectの使い方は?

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連合(EU)と交差法のこのコードを使用する必要がありますか?フォームの労働組合との交点を持っている場合は

+1

これはよく知られている述語ビルダーです。これは '.Where'節の構成を容易にするために存在します。 'Union'や' Intersect'とは何の関係もありません。通常どおり、これらのメソッドを使用します。 ";(N") ' 対応して、' ' 述語= predicate.Or P => p.CustomerID.Contains() ' VAR述語= PredicateExtensions.False ()のようなものを使用": –

+1

は私がヒントを与えられました「Union」は「Or」で置き換えられ、「Intersect」は「And」で置き換えられます。 – BILL

+1

ヒントは私には意味がありません。 'Union'と' Intersect'はシーケンス上で動作する集合演算です。 PredicateBuilderの 'And'と' Or'は述語で動作するブール演算です。彼らは本当にお互いに関係がありません。 –

答えて

0

は:

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

interpredicate0predicate1両方に該当した対象の値を持つことになりますしながらunionpredicate0またはpredicate1いずれかに該当したの値を持つことになります。このため

、次は同じ結果だろう:

var union = source.Where(predicate0.Or(predicate1)); 
var inter = source.Where(predicate0.And(predicate1)); 

をこれはしかし2つのWhereクエリによって生成された労働組合との交差点のコンポーネントに依存します。同類で:

var union = source1.Where(predicate0).Select(item => item.ID) 
    .Union(source2.Where(predicate1).Select(item => item.ID)); 

そして、それは述語でも同じタイプのではない可能性が高いです、と組み合わせる述語がUnionIntersectの代替として動作しません。他の例は、まだあります。

述語、共用体、および交差がどのように機能するかの理解の観点から、最初の例を両方の方法で考えることができると便利ですが、

関連する問題