Linq根据子标准选择父级

nan*_*dos 4 linq entity-framework-4

大局:

我正在编写一个搜索表单,用户可以选择一个或多个条件来过滤搜索结果.其中一个标准与儿童关系有关.

我正在尝试创建一个扩展方法,Iqueryable<Parent>以便我可以将其用作"链接"的一部分.

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

public static IQueryable<Parent> ContainsChild(this IQueryable<Parent> qry, int[]  childrenIDs)
Run Code Online (Sandbox Code Playgroud)

父表和子表:

Parent
  ParentID
  Name
  Description

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

Selection criteria:
int[] ids = new int[3] {1,2,3}; 
Run Code Online (Sandbox Code Playgroud)

用法是这样的:

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)
   }
}
Run Code Online (Sandbox Code Playgroud)

我想弄清楚的是如何创建ContainsChild方法,该方法返回IQueryable<Parent>父项AnotherIDids数组中至少有一个子节点的位置.

(我正在尝试使用EF4来完成此任务)

任何帮助完全赞赏.

Sla*_*uma 11

也许这个:

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

编辑

只是为了娱乐另一种应该给出相同结果的方式:

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

为第一个版本生成的SQL看起来更友好,所以我可能更喜欢第一个版本.