gpt4 book ai didi

entity-framework - Entity Framework : Querying Child Entities

转载 作者:行者123 更新时间:2023-12-03 06:26:20 29 4
gpt4 key购买 nike

看来我无法从数据库中获取父级及其子级的子集。

例如...

db.Parents
.Include(p => p.Children)
.Where(p => p.Children.Any(c => c.Age >= 5))

这将返回所有有 5 岁以上 child 的“ parent ”,但如果我迭代“Parents.Children”集合,所有 child 都将出现(而不仅仅是 5 岁以上的 child )。

现在这个查询对我来说确实有意义(我已经要求包含子项并且我已经得到了它们!),但可以想象我希望在某些情况下将 where 子句应用于子集合。

我怎样才能获得一个 IEnumerable,其中每个 parent 都有一个过滤后的 child 集合(年龄>=5)?

最佳答案

在单个数据库往返中获取具有已过滤子集合的父集合的唯一方法是使用投影。无法使用预先加载 (Include),因为它不支持过滤,Include 始终加载整个集合。 @Daz 显示的显式加载方式需要每个父实体一次往返。

示例:

var result = db.Parents
.Select(p => new
{
Parent = p,
Children = p.Children.Where(c => c.Age >= 5)
})
.ToList();

您可以直接使用这个匿名类型对象的集合。 (您还可以投影到您自己的命名类型中,而不是匿名投影(但不能投影到像 Parent 这样的实体中)。)

如果您不禁用更改跟踪(使用 AsNoTracking() ),EF 的上下文也会自动填充 ParentChildren 集合例子)。在这种情况下,您可以将父项投影到匿名结果类型之外(发生在内存中,没有数据库查询):

var parents = result.Select(a => a.Parent).ToList();

parents[i].Children 将包含每个 Parent 的已过滤子项。

<小时/>

编辑到问题中的最后一次编辑:

I am after a) A list of parents who have a child older than 5 (and include only those children).

上面的代码将返回所有个 parent ,并且仅包含 Age >= 5 的 child ,因此如果只有 child Age < 5. 您可以使用 parent 的附加 Where 子句将其过滤掉,以便仅获取至少有一个的 parent (Any) Age >= 5 的 child :

var result = db.Parents
.Where(p => p.Children.Any(c => c.Age >= 5))
.Select(p => new
{
Parent = p,
Children = p.Children.Where(c => c.Age >= 5)
})
.ToList();

关于entity-framework - Entity Framework : Querying Child Entities,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7753039/

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