Entity Framework 如何仅预加载其他表的子集?

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

示例:

考虑两个表格DocumentSection,其中一个Document包含一组Section,我想要急切地加载已激活(未软删除)的Section。这是SqlFiddle中的一个模式。

在SQL中,我可以通过以下查询实现此目的:

SELECT 
    D.*, S.* 
FROM 
Document D
INNER JOIN Section S ON S.DocumentId = D.Id AND S.IsActive = 1
WHERE D.IsActive = 1

请注意,连接的ON子句和WHERE子句中都需要检查活动标志。
在EF中,我尝试过:
_context.Set<Document>()
        .Include(d => d.Sections)
        .All(d => d.IsActive);

它可以工作,但会急切地加载所有活动和非活动的部分。
我还尝试了这个:
_context.Set<Document>()
        .Include(d => d.Sections.Where(sec => sec.IsActive))
        .All(d => d.IsActive);

但它会抛出运行时异常;看起来EF不喜欢在Include内部使用Where。我正在使用Entity Framework 6。
1个回答

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

жҲ‘и®ӨдёәDocumentд»Қе°ҶеҢ…еҗ«дёҖз»„жҙ»еҠЁе’Ңйқһжҙ»еҠЁйғЁеҲҶгҖӮйҷӨйқһжҲ‘д»Ҙжҹҗз§Қж–№ејҸе°Ҷanonymous.SectionsеҲҶй…Қз»ҷanonymous.Document.SectionsгҖӮ - Sina Iravanian
不需要,它们会自动连接,这被称为关联修复,你可以尝试并检查结果,每个活动文档只包含活动部分。 - Yuliam Chandra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接