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

如何规避LINQ Queryable查询中的NullReferenceException?

解决工时统计中薪资null时返回0的问题

原代码的核心问题是:FirstOrDefault()可能返回null,此时直接访问.Salary会触发空引用异常,导致?? 0的兜底逻辑根本无法生效。

修正后的代码方案

方案1:拆分逻辑(可读性更强)

time.GroupBy(x => x.User).Select(z => new
{
    User = string.Format("{0} {1}", z.Key.Users.Name, z.Key.Users.Surname),
    Hours = z.Sum(x => x.Hours),
    TotalPay = z.Sum(x => 
    {
        // 先获取当前工时对应的最近薪资记录
        var latestSalaryRecord = salaries.Where(y => y.User.Id == x.User.Id && y.Date <= x.Date)
                                         .OrderByDescending(y => y.Date)
                                         .FirstOrDefault();
        // 薪资记录不存在或Salary为null时,用0兜底
        var hourlyRate = latestSalaryRecord?.Salary ?? 0;
        return x.Hours * hourlyRate;
    })
});

方案2:紧凑写法(一行完成)

time.GroupBy(x => x.User).Select(z => new
{
    User = string.Format("{0} {1}", z.Key.Users.Name, z.Key.Users.Surname),
    Hours = z.Sum(x => x.Hours),
    TotalPay = z.Sum(x => x.Hours * (salaries.Where(y => y.User.Id == x.User.Id && y.Date <= x.Date)
                                             .OrderByDescending(y => y.Date)
                                             .FirstOrDefault()?.Salary ?? 0))
});

关键修改说明

  • 使用?.Salary替代直接访问.Salary:先判断FirstOrDefault()返回的薪资对象是否为null,再安全获取Salary属性,避免空引用异常
  • ?? 0的作用:当薪资对象不存在(返回null)或Salary本身为null时,自动将值替换为0,确保乘法运算能正常执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:31:09