如何实现LINQ查询表达式与方法语法等效的空值检查逻辑
你之前的写法报错有两个核心原因:
- 直接用
join是内连接逻辑,只要c或d没有匹配值,整条记录就会被过滤,和你原代码中c为空仍可返回结果的逻辑不符 - EF的LINQ查询需要将表达式树转换为SQL,不支持C#特有的空传播运算符
?.,因此触发CS8072错误
要实现和原代码完全等效的查询表达式,用LINQ左外连接的标准写法join ... into + DefaultIfEmpty()即可:
var dto = await ( from a in _db.A where a.IdA == param join b in _db.B on a.IdA equals b.IdB1 join c in _db.C on b.IdB2 equals c.IdC1 into cGroup from c in cGroup.DefaultIfEmpty() join d in _db.D on c.IdC2 equals d.IdD into dGroup from d in dGroup.DefaultIfEmpty() select new DTOFin { // 赋值时如果字段不可为空,可自行处理空值默认值,例:XXX = c == null ? default : c.XXX ... } ).FirstOrDefaultAsync();
补充说明:
- 合并后的查询仅访问一次数据库,性能比原写法的四次独立查询更好
- 如果你的业务逻辑依赖原写法分多次查询的事务/加载行为,无需强行合并为查询表达式,保持原有方法语法写法即可
内容的提问来源于stack exchange,提问作者Billy Joseph
相关产品推荐
相关产品推荐

