EF6查询嵌套表时如何获取单个实体对象而非二维集合
问题根因
你当前的查询逻辑存在嵌套返回的问题:Select(x => x.ConditionalQuestions.Where(c => c.Id == questionId)) 会遍历OperatorAssessmentQuestions表的每一条主记录,对每条主记录单独筛选它关联的符合条件的ConditionalQuestions子项集合,最后调用ToList()得到的是「集合的集合」——也就是你看到的二维数组结构:外层列表的长度等于主表总记录数,每个元素是对应主记录下匹配Id的子项集合,没有匹配项的位置就会是空数组。
修复方案
你要的是全局匹配对应Id的单个子实体,不需要逐行遍历主表筛子集合,根据你的上下文选下面任意一种写法即可:
方案1(性能最优,优先用)
如果你的DbContext里直接暴露了ConditionalQuestions对应的DbSet,直接在子表上筛选单条即可:
// 返回匹配Id的单个实体,无匹配时返回null var question = _operatorAssessmentContext.ConditionalQuestions .FirstOrDefault(c => c.Id == questionId);
方案2(子表未单独暴露DbSet时用)
如果没有单独给子表配置DbSet,用SelectMany把所有主记录关联的子集合打平成一维集合,再筛选单条:
// 先打平所有关联的ConditionalQuestions,再按Id取单条 var question = _operatorAssessmentContext.OperatorAssessmentQuestions .SelectMany(x => x.ConditionalQuestions) .FirstOrDefault(c => c.Id == questionId);
补充:因为Id是ConditionalQuestions的主键,全局唯一,用
FirstOrDefault拿到的就是你要的{Id:1, Name:Abc}格式的单个对象,不会再出现嵌套数组的结构。
内容的提问来源于stack exchange,提问作者ARH
相关产品推荐
相关产品推荐

