实体框架-如何过滤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的集合?

实体框架-如何过滤EntityCollection关系

据我所知,你不能过滤掉包含的实体:一旦你写了包含,你得到所有连接的实体。

一种方法是在不同的集合中选择连接的实体,并分别跟踪它们。

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

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