gpt4 book ai didi

Linq 根据子条件选择父项

转载 作者:行者123 更新时间:2023-12-04 22:35:43 25 4
gpt4 key购买 nike

大图:

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

我正在尝试为 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>,其中 parent 至少有一个 child 在 AnotherID 数组中带有 ids

(我正在尝试使用 EF4 来完成此操作)

任何帮助完全赞赏。

最佳答案

也许这个:

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

关于Linq 根据子条件选择父项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7017133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com