LINQ中通过逻辑表达式给字段赋值报错求助
问题解决:SqlNullValueException 处理方案
错误原因
你遇到的SqlNullValueException是因为results.File字段可能为null,而你使用的.NET原生string.IsNullOrEmpty()方法在EF Core转换为SQL查询时,无法正确处理数据库中的null值——SQL层面不能对null直接执行字符串判断操作,从而触发异常。
解决方案
有两种可靠的修复方式:
方式1:使用EF Core专属的空值判断方法
EF Core提供了EF.Functions.IsNullOrEmpty()方法,专门用于在LINQ查询中处理数据库字段的null和空字符串判断,它会生成正确的SQL逻辑(IS NULL OR = '')。修改后的代码如下:
var record = from results in _context.Results join students in _context.Students on results.Student_Id equals students.Id join practice in _context.Practice on results.Theme_Id equals practice.Id join gr in _context.Groups on students.Group_Id equals gr.Id where gr.Title == group_selected select new { Theme = practice.Title, Student = students.Name, Report = EF.Functions.IsNullOrEmpty(results.File) ? "No report" : "Has report" };
方式2:显式拆分null和空字符串判断
如果你的EF Core版本较低(低于3.0),可以显式先判断字段是否为null,再判断是否为空字符串,避免直接调用可能触发异常的方法:
var record = from results in _context.Results join students in _context.Students on results.Student_Id equals students.Id join practice in _context.Practice on results.Theme_Id equals practice.Id join gr in _context.Groups on students.Group_Id equals gr.Id where gr.Title == group_selected select new { Theme = practice.Title, Student = students.Name, Report = results.File == null || results.File == "" ? "No report" : "Has report" };
如果需要同时处理全空格的空白字符串,可以再加上Trim()判断:
Report = results.File == null || results.File.Trim() == "" ? "No report" : "Has report"
内容的提问来源于stack exchange,提问作者Lev
相关产品推荐
相关产品推荐

