You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

关键修改说明

  1. 查询起点切换为tbl_contrato:确保所有符合过滤条件的合同都会被保留,哪怕没有对应的更新记录
  2. 使用GroupJoin实现左连接:对应原SQL的RIGHT JOIN逻辑,不会因为关联表没有数据就丢弃主表行
  3. 添加null条件访问符?.:所有导航属性访问都加空值判断,避免空引用异常同时不会隐式过滤空值行
  4. 简化分组逻辑:直接对每个合同的更新记录按id_build_verus倒序取第一条,和原SQL子查询取最大id_build_verus的逻辑完全对齐,避免多余分组导致的数据重复

内容的提问来源于stack exchange,提问作者CaioVC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:57:04