2011-08-10 70 views
4

大圖:Linq根據子標準選擇父項

我正在處理搜索表單,用戶可以選擇一個或多個條件來篩選搜索結果。其中一個標準與兒童關係有關。

我想創建一個擴展方法到Iqueryable<Parent>,所以我可以用作我的「鏈接」的一部分。

方法簽名(截至目前)是:

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

父表和子表:

Parent 
    ParentID 
    Name 
    Description 

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

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

用法是這樣的:

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

我想弄清楚的是如何創建ContainsChild方法,該方法返回一個IQueryable<Parent>其中父母至少有一個陣列中的AnotherID孩子。

(我試圖用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))); 
} 

編輯

只是爲了好玩另一種方式,也應該給予同樣的結果:

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

第一個版本生成的SQL看起來更友好雖然,所以我可能會更喜歡第一個版本。

+0

簡單而優雅。謝謝,工作很棒! – nandos

相關問題