如何规避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
相关产品推荐
相关产品推荐

