C# 从数据库查询的Linq语句如何包含值为null的单元格对应行
Linq查询保留空值行的修改方案
问题根因
你原来的Linq逻辑存在两个核心问题,导致空值行被过滤:
- 查询起点是
tbl_controle_atualizacao_contrato(更新控制表),从未有过更新记录的合同不会出现在这个表中,直接就被排除了,和原SQL里RIGHT JOIN tbl_contrato保留所有有效合同的逻辑不符 - 没有做空值安全访问,导航属性为null时会触发隐式过滤,导致有部分空字段的行被丢弃
修正后的Linq代码
var listaTotalContratos = db.tbl_contrato // 先过滤符合条件的合同,对应原SQL的WHERE条件 .Where(c => c.contrato != 0 && c.ativo == true && c.id_empresa == 1) .GroupJoin( // 关联更新控制表,左连接保留所有合同 db.tbl_controle_atualizacao_contrato, c => c.id_contrato, cac => cac.id_contrato, (c, cacList) => new { Contrato = c.contrato.ToString(), // 处理地址的null情况 UF = c.tbl_cliente?.tbl_pessoa?.tbl_endereco.FirstOrDefault()?.uf, // 取当前合同最新的build对应的记录 LatestUpdate = cacList.OrderByDescending(x => x.id_build_verus).FirstOrDefault() } ) .Select(res => new { res.Contrato, res.UF, // 空值处理,没有更新记录时返回null build = res.LatestUpdate?.tbl_build_verus?.build, data_atualizacao = res.LatestUpdate?.data_atualizacao }) .ToList();
关键修改说明
- 查询起点切换为
tbl_contrato:确保所有符合过滤条件的合同都会被保留,哪怕没有对应的更新记录 - 使用
GroupJoin实现左连接:对应原SQL的RIGHT JOIN逻辑,不会因为关联表没有数据就丢弃主表行 - 添加null条件访问符
?.:所有导航属性访问都加空值判断,避免空引用异常同时不会隐式过滤空值行 - 简化分组逻辑:直接对每个合同的更新记录按
id_build_verus倒序取第一条,和原SQL子查询取最大id_build_verus的逻辑完全对齐,避免多余分组导致的数据重复
内容的提问来源于stack exchange,提问作者CaioVC
相关产品推荐
相关产品推荐

