基于子条件选择父级的Linq查询

4

整体概述:

我正在开发一个搜索表单,在该表单中,用户可以选择一个或多个筛选条件来过滤搜索结果。其中一个条件与子元素关系有关。

我试图创建一个扩展方法给 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,其中父项至少有一个子项的AnotherID在ids数组中。
(我试图使用EF4来完成这个任务)
非常感谢您的帮助。
1个回答

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看起来更友好,所以我可能更喜欢第一版。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接