如何在linq中处理空值?

recordsList.ListOfRecords = new StudentRecordsBAL() .GetStudentsList() .Select(q => new StudentRecords() { _RollNumber = q._RollNumber, _Class = q._Class, _Name = q._Name, _Address = q._Address, _City = q._City, _State = q._State, _Subjects = q._Subject, _AttendedDays = new AttendanceBAL() .GetAttendanceListOf(q._RollNumber) .Where(date => date != null) .Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day)) .Distinct() .ToList(), _AttendedSubjects = GetAttendedSubjects(q._RollNumber) }).ToList(); 

上述代码中的方法GetAttendanceListOf(q._RollNumber)将返回数据库中的记录列表,如果传递的“roll-no”没有记录,则返回“null”。 linq查询将终止生成错误

“价值不能为空”。

有没有办法处理此错误并使LINQ跳转到下一步?

 _AttendedDays = new AttendanceBAL() .GetAttendanceListOf(q._RollNumber) .Where(date => date != null) .Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day)) .Distinct() .ToList(), 

问题是在null实例上运行Where() 。 可能的解决方案:

1)修改GetAttendanceListOf以在没有出席时返回空列表(一般来说好主意,因为空对象模式通常是救生员,而对于集合,空集合通常在语义上类似于null)
2)如果你不控制那个方法,写一个安全的扩展方法,如果为null,将返回空列表,例如

 List SafeAttendanceList(this AttendanceBALType bal, RollNumber rn) { return bal.GetAttendanceListOf(rn) ?? new List(); } 

然后将其称为:

 _AttendedDays = new AttendanceBAL() .SafeAttendanceListOf(q._RollNumber) .Where(date => date != null) 

你可以试试

 recordsList.ListOfRecords = new StudentRecordsBAL().GetStudentsList().Select(q => { var attendanceList = new AttendanceBAL().GetAttendanceListOf(q._RollNumber); if (attendanceList == null) return null; return new StudentRecords() { _RollNumber = q._RollNumber, _Class = q._Class, _Name = q._Name, _Address = q._Address, _City = q._City, _State = q._State, _Subjects = q._Subject, _AttendedDays = attendanceList.Where(date => date != null).Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day)).Distinct().ToList(), _AttendedSubjects = GetAttendedSubjects(q._RollNumber) }; }).Where(q => q != null).ToList(); 

这将检查您是否对null对象执行Where操作并过滤掉任何null结果。

如果没有结果,Linq ToList()将返回一个空列表。 错误可能来自其他地方。

我建议您使用方法来创建对象,它将使您的查询更容易阅读和调试。 我建议您分多步执行此操作以确定哪些内容为null以及哪些内容无法执行。

该错误可能来自GetAttendanceListOf(),当让方法返回IList或IEnumerable时,如果没有结果,则应该返回一个空列表,如果它为null,它将阻止您每次validation。

正如@Zdeslav Vojkovic所建议的那样,修改GetAttendanceListOf以返回空列表(如果为null)或执行以下操作:

 _AttendedDays =(new AttendanceBAL()
     .GetAttendanceListOf(q._RollNumber)??  Enumerator.Empty ())
     .Where(date => date!= null)
     .Select(date => new DateTime(date._Date.Year,date._Date.Month,date._Date.Day))
     。不同()
     .ToList(),

(你可以在没有额外括号的情况下做到这一点)

要快速修复,请修改此行

_AttendedDays = new AttendanceBAL()。GetAttendanceListOf(q._RollNumber)。所在…

对此

_AttendedDays =(new AttendanceBAL()。GetAttendanceListOf(q._RollNumber) ?? new List() )。所在…