You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core中如何基于父级导航属性筛选子级导航数据?

实体模型定义

Walk 实体

public class Walk
{
    public Guid WalkId { get; set; }
    public int StoreNbr { get; set; }
    public StoreInformation StoreInformation { get; set; }
    public WalkTemplate Template { get; set; } = null!;
    public ICollection<WalkQuestionResult> WalkQuestionResults { get; set; } = new List<WalkQuestionResult>();
}
  • Walk 与 WalkTemplate 为一对多关系(一个WalkTemplate对应多个Walk)

WalkTemplate 实体

public class WalkTemplate
{
    public int Id { get; set; }
    public ICollection<Walk> Walks { get; set; }
    public ICollection<WalkQuestion> Questions { get; set; } = new List<WalkQuestion>();
    public ICollection<WalkTemplateQuestion> TemplateQuestions { get; set; }
}
  • WalkTemplate 与 WalkQuestion 通过 WalkTemplateQuestion 连接表形成多对多关系

WalkQuestion 实体

public class WalkQuestion 
{
    public int Id { get; set; }
    public ICollection<WalkTemplate> Templates { get; set; }
    public ICollection<WalkQuestionsCondition> Conditions { get; set; }
    public ICollection<WalkTemplateQuestion> TemplateQuestions { get; set; }
}
  • WalkQuestion 与 WalkQuestionsCondition 为一对多关系(一个WalkQuestion对应多个条件)

当前需求与问题

需要查询指定的Walk实体,但仅加载符合该Walk对应门店全部条件的WalkQuestion数据,门店条件存储在WalkStoreAttributes表中。

现有代码实现了筛选逻辑,但硬编码了门店编号(16487),需要替换为引用当前Walk实体的StoreNbr属性:

await _context.Walks
                .Include(w => w.Template)
                .ThenInclude(w => w.Questions.Where(q => q.Conditions.All(c => _context.WalkStoreAttributes.Where(s => s.StoreNbr == 16487).Select(a => a.Attribute).Contains(c.Condition))))
                .Include(w => w.CompletedByEmployee)
                .SingleOrDefaultAsync(w => w.WalkId == id);

解决方案

要在ThenInclude的过滤条件中引用外层Walk的StoreNbr,直接在lambda表达式中捕获外层的w变量即可,EF Core会自动将其翻译为关联SQL:

await _context.Walks
    .Include(w => w.Template)
        .ThenInclude(t => t.Questions.Where(q => 
            q.Conditions.All(c => 
                _context.WalkStoreAttributes
                    .Where(s => s.StoreNbr == w.StoreNbr)
                    .Select(a => a.Attribute)
                    .Contains(c.Condition)
            )
        ))
    .Include(w => w.CompletedByEmployee)
    .SingleOrDefaultAsync(w => w.WalkId == id);

说明

  • 这里通过w.StoreNbr直接关联当前Walk的门店编号,EF Core会自动生成对应的关联查询逻辑,实现基于当前Walk所属门店的动态筛选。
  • 确保WalkStoreAttributes表的StoreNbr字段与Walk的StoreNbr字段逻辑匹配,保证筛选结果准确。

内容的提问来源于stack exchange,提问作者Canolyb1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:27:27