在我正在使用的遗留系统中,每个表都支持通过名为IsActive
的标记进行软删除。如何通过Include
方法使用Entity Framework的急切加载,但只是急切加载活动(非软删除)表的子集,而不是全部加载。
考虑两个表Document
和Section
,其中Document
包含一组Section
s,我想加载Document
个活动的Section
没有软删除)SELECT
D.*, S.*
FROM
Document D
INNER JOIN Section S ON S.DocumentId = D.Id AND S.IsActive = 1
WHERE D.IsActive = 1
急切地加载。这是SqlFiddle中的架构。
在SQL中,我使用此查询实现此目的:
ON
请参阅联接的WHERE
子句以及_context.Set<Document>()
.Include(d => d.Sections)
.All(d => d.IsActive);
子句的活动标志检查。
在EF我尝试过:
_context.Set<Document>()
.Include(d => d.Sections.Where(sec => sec.IsActive))
.All(d => d.IsActive);
它可以工作但是急切地加载活动和非活动部分。
我也试过这个:
Where
但它会抛出运行时异常;似乎EF不喜欢Include
内的{{1}}。
我正在使用Entity Framework 6。
答案 0 :(得分:1)
您可以使用关联修正。
var result = _context.Set<Document>()
.Where(d => d.IsActive)
.Select(d =>
new
{
Document = d,
Sections = d.Sections.Where(s => s.IsActive)
})
.ToArray().Select(anonymous => anonymous.Document).ToArray();