实体框架Eager仅加载其他表的子集

时间:2014-08-05 04:44:20

标签: c# sql entity-framework

在我正在使用的遗留系统中,每个表都支持通过名为IsActive的标记进行软删除。如何通过Include方法使用Entity Framework的急切加载,但只是急切加载活动(非软删除)表的子集,而不是全部加载。

实施例

考虑两个表DocumentSection,其中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。

1 个答案:

答案 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();