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

时间:2011-08-24 12:53:58

标签: c# entity-framework filter linq-to-entities

我有以下表结构:

表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对象,其EntityCollections为Bs,Cs和Cs各自的EntityCollection为Ds

但是,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);
}

这是将As,Bs和Cs组合成带有EntityCollections的A的最佳方法吗?

我如何将Ds作为每个C的集合?

1 个答案:

答案 0 :(得分:1)

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

其中一种方法是选择不同集合中的连接实体并单独跟踪它们。

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

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