我有以下表结构:
表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的集合?
答案 0 :(得分:1)
据我所知,您无法过滤掉所包含的内容:一旦您编写了包含内容,您就会获得所有已连接的实体。
其中一种方法是选择不同集合中的连接实体并单独跟踪它们。
另一方面,您可以包含已连接的集合并在使用时应用过滤。
请注意您当前的方法有一个缺点: 您新创建的实体与上下文断开连接。这意味着您在使用它们时会禁用自我跟踪功能。