大局:
我正在使用搜索表单,用户可以选择一个或多个条件来过滤搜索结果。其中一个标准与儿童关系有关。
我正在尝试为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
数组中至少有一个ids
的孩子。
(我正在尝试使用EF4来实现这一目标)
任何帮助都完全赞赏。
答案 0 :(得分: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看起来更友好,所以我可能更喜欢第一个版本。