EF中使用DefaultIfEmpty后Where条件是否需添加OR的技术咨询
解决方案
你需要在Where语句中添加OR条件,否则左外连接(DefaultIfEmpty)的作用会被抵消,无法获取客户未作答的投票选项。
问题分析
原代码的Where条件(mppss.MeetingPollingPartsId == MeetingPollingPartsId && mppvs.CustomerId == CustomerId)会过滤掉所有mppvs为NULL的行(也就是客户未作答的情况)——因为当mppvs为NULL时,mppvs.CustomerId == CustomerId的结果是false,整个条件不成立,导致未作答的选项被排除。
修正后的EF代码
var MeetingPollingParticipantsAnswers = (from mppss in db.MeetingPollingParts join mppv in db.MeetingPollingPartsValues on mppss.MeetingPollingPartsId equals mppv.MeetingPollingPartsId join mppvs in db.MeetingPollingResponseValues on mppv.MeetingPollingPartsValuesId equals mppvs.MeetingPollingPartsValuesId into actualAnswers from mppvs in actualAnswers.DefaultIfEmpty() where mppss.MeetingPollingPartsId == MeetingPollingPartsId && (mppvs == null || mppvs.CustomerId == CustomerId) select new Model.MeetingPollingParticipantsAnswers { Question = mppv.QuestionValue, Selected = mppvs != null && mppvs.MeetingPollingPartsValuesId == mppv.MeetingPollingPartsValuesId, MeetingPollingPartsValuesId = mppv.MeetingPollingPartsValuesId }).ToList();
关键修改点说明
- Where条件调整:添加
mppvs == null的判断,允许左外连接后mppvs为NULL的行(即客户未作答的选项)保留下来,同时确保MeetingPollingPartsId匹配目标投票项。 - Selected字段修正:原代码中
aa变量未定义且逻辑有误,修正为判断mppvs不为空且对应的选项ID匹配,未作答时Selected自动为false。 - MeetingPollingPartsValuesId字段修正:替换原代码中未定义的
aa变量,改为使用mppv的对应字段,确保获取投票选项本身的ID。
逻辑验证
- 客户已作答:
mppvs存在,mppvs.CustomerId == CustomerId条件成立,返回该客户选择的选项,Selected为true。 - 客户未作答:
mppvs为NULL,mppvs == null条件成立,返回该投票的所有选项,Selected为false,符合需求。
内容的提问来源于stack exchange,提问作者Jefferson
相关产品推荐
相关产品推荐

