gpt4 book ai didi

c# - Entity Framework - 如何过滤 EntityCollection 关系

转载 作者:太空宇宙 更新时间:2023-11-03 14:13:10 26 4
gpt4 key购买 nike

我有以下表结构:

表 A、表 B、表 C 和表 D,其中

A 1..* B
A 1..* C
C 1..* D

首先,我希望返回所有数据(通过 WCF 服务,因此没有延迟加载),所以这是原始代码:

var a = (from a in context.As.Include("Bs").Include("Cs.Ds")
where a.Id = paramId
select a).SingleOrDefault();

这将返回一个 A 对象,其中包含 Bs 和 Cs 的 EntityCollection,而 Cs 每个都有一个 Ds 的 EntityCollection

但是,B 和 C 都有一个 IsActive 标志,我现在只想返回 Active 的 Bs 和 Cs。

我知道我现在不能使用 .Include 因为这将始终返回整个集合。

经过一些谷歌搜索,到目前为止我有:

var query = (from a in context.As
where a.Id = paramId
select new
{
A = a,
Bs = from b in a.Bs where b.IsActive select b,
Cs = from c in a.Cs where c.IsActive select c
}).SingleOrDefault();

这是构成查询的最佳方式吗?

然后我将匿名类型转换为 A 对象:

var a = query.A;

foreach (var b in query.Bs)
{
a.Bs.Add(b);
}

foreach (var c in query.Cs)
{
a.Cs.Add(c);
}

这是使用 EntityCollections 将 As、Bs 和 Cs 组合成 A 的最佳方式吗?

我如何同时获得 Ds 作为每个 C 的集合?

最佳答案

据我所知,您无法过滤掉包含的实体:一旦您编写了包含,您就会获得所有连接的实体。

其中一种方法是选择不同集合中的连接实体并分别对其进行跟踪。

另一方面,您可以包含连接的集合并在使用它们时应用过滤。

请注意,您当前的方法有一个缺点:您新创建的实体与上下文断开连接。这意味着您在使用 self 跟踪功能时会禁用它们。

关于c# - Entity Framework - 如何过滤 EntityCollection 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7175756/

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