Entity framework 包括/然后包括在EF核心中的位置

Entity framework 包括/然后包括在EF核心中的位置,entity-framework,linq,api,asp.net-core,.net-core,Entity Framework,Linq,Api,Asp.net Core,.net Core,我需要在包含的地方使用 var templatesFields = await _context.Sections .Include(x => x.Subtitles) .ThenInclude(r => r.Fields.Where(t=>t.TemplatesFields.TemplateID==TemplateID)) .ThenInclude(r => r.OptionSources)

我需要在包含的地方使用

        var templatesFields = await _context.Sections
        .Include(x => x.Subtitles)
        .ThenInclude(r => r.Fields.Where(t=>t.TemplatesFields.TemplateID==TemplateID))
        .ThenInclude(r => r.OptionSources)
        .ThenInclude(r => r.OptionsSourcesDetails)
        .ToListAsync();

不能在
包含
然后包含
中使用where条件。您可以做的是:

var templatesFields = await _context.Sections
    .Include(x => x.Subtitles)
    .ThenInclude(r => r.Fields)
    .ThenInclude(r => r.OptionSources)
    .ThenInclude(r => r.OptionsSourcesDetails)
    .Where(t=>t.Subtitles.Fields.Any(x => x.TemplatesFields.TemplateID==TemplateID))
    .ToListAsync();
编辑:这在.Net Core 5.0中是可能的(目前正在预览中)

来自:

不支持在
Include
IncludeThen
中进行筛选。使用
选择
创建投影:

questionnaire = _context.Questionnaires
.Select(n => new Questionnaire
{
    Id = n.Id,
    Name = n.Name,
    Questions = n.Questions.Select(q => new Question
    {
       Id = q.Id,
       Text = q.Text,
       Answers = q.Where(a => a.UserId == userId).ToList()
    }).ToList()
})
.FirstOrDefault(qn => qn.Id == questionnaireId);

我已经用这种结构制定了我的代码,虽然我还没有尝试过它,因为缺少数据,但我仍然坚持使用它。谢谢我仍然在学习这个,所以在假设我是对的之前先测试一下,但我很确定这并没有达到预期的效果。字段的where子句用于减少附加到字幕的字段记录,但在提供的解决方案中,它只是删除没有Subtiutle.Fields记录的任何模板。实际上,该问题要求“给我所有模板并包含与条件匹配的字段信息”,其中提供的答案是“给我所有模板和所有字段信息,模板中有任何与条件匹配的字段”。这不是问题,这是一个功能。检查网芯5
questionnaire = _context.Questionnaires
.Select(n => new Questionnaire
{
    Id = n.Id,
    Name = n.Name,
    Questions = n.Questions.Select(q => new Question
    {
       Id = q.Id,
       Text = q.Text,
       Answers = q.Where(a => a.UserId == userId).ToList()
    }).ToList()
})
.FirstOrDefault(qn => qn.Id == questionnaireId);