实体框架-如何过滤EntityCollection关系
本文关键字:过滤 EntityCollection 关系 框架 何过滤 实体 | 更新日期: 2023-09-27 18:06:36
我有以下表格结构:
表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对象,其中包含b和c的EntityCollections,而c都有一个Ds的EntityCollection
然而,B和C都有一个IsActive
标志,我现在只想返回B和C,其中活动。
我知道我现在不能使用.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);
}
这是将A, b和c与EntityCollections组合成A的最佳方式吗?
如何将d作为每个C的集合?
据我所知,你不能过滤掉包含的实体:一旦你写了包含,你得到所有连接的实体。
一种方法是在不同的集合中选择连接的实体,并分别跟踪它们。
另一方面,您可以包含连接的集合,并在使用它们时应用过滤。
请注意,您当前的方法有一个缺点:新创建的实体与上下文断开连接。这意味着当您使用它们时,您正在禁用自跟踪功能。