2011-08-10 20 views
4

大きな画像:Linqは子供の基準に基づいて親を選択しています

私は検索結果をフィルタリングするための条件を1つ以上選択できる検索フォームを作成しています。基準の1つは、子関係に関連しています。

Iqueryable<Parent>に拡張メソッドを作成しようとしていますので、私は「チェーン」の一部として使用できます。

(今のところ)メソッドのシグネチャは次のとおりです。

public static IQueryable<Parent> ContainsChild(this IQueryable<Parent> qry, int[] childrenIDs) 

親テーブルと子テーブル:

var parents = repository.All() //returns Iqueryable<Parent> 
public IQueryable<Parent> Search(Search seach){ 
    if (search.Criteria1 != null){ 
     parents = parents.FilterByFirstCriteria(search.Criteria1); 
    } 
    if (search.ChildrenIDs != null){ //ChildrenIDs is an int[] with values 1,2,3 
     parents = parents.ContainsChild(search.ChildrenIDs) 
    } 
} 

Parent 
    ParentID 
    Name 
    Description 

Child 
    ParentID (FK) 
    AnotherID (from a lookup table) 

Selection criteria: 
int[] ids = new int[3] {1,2,3}; 

使い方はこのようなものになるだろう私が理解しようとしているのは、IQueryable<Parent>を返すContainsChildメソッドを作成する方法です。両親にはidsの配列にAnotherIDの子が少なくとも1人あります。

(私はこれを達成するためにEF4を使用しようとしている)

完全に理解すべてのヘルプ。

答えて

11

おそらく、この:

public static IQueryable<Parent> ContainsChild(this IQueryable<Parent> qry, 
    int[] childrenIDs) 
{ 
    return qry.Where(p => p.Children.Any(c => childrenIDs.Contains(c.AnotherID))); 
} 

編集

楽しみのためだけに同じ結果を与える必要があり、別の方法:最初のバージョン用に生成されたSQLは、より友好的に見える

public static IQueryable<Parent> ContainsChild(this IQueryable<Parent> qry, 
    int[] childrenIDs) 
{ 
    return qry.Where(p => p.Children.Select(c => c.AnotherID) 
            .Intersect(childrenIDs).Any()); 
} 

をしかし、私はおそらく最初のバージョンを好むだろう。

+0

シンプルで上品です。ありがとう、素晴らしい仕事! – nandos

関連する問題