如何在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() )。所在…