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
相关产品推荐
相关产品推荐

