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跳转到下一步?
答案 0 :(得分:10)
_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 object pattern通常是一个救生员,而对于收集,空集合通常在语义上类似于空)
2)如果你不控制那个方法,写一个安全的扩展方法,如果为null,将返回空列表,例如。
List<AttendanceType> SafeAttendanceList(this AttendanceBALType bal, RollNumber rn)
{
return bal.GetAttendanceListOf(rn) ?? new List<AttendanceType>();
}
然后将其称为:
_AttendedDays = new AttendanceBAL()
.SafeAttendanceListOf(q._RollNumber)
.Where(date => date != null)
答案 1 :(得分:0)
如果没有结果,Linq ToList()将返回一个空列表。 错误可能来自其他地方。
我建议您使用方法来创建对象,它会使您的查询更容易阅读和调试。我建议您分多步执行此操作以确定哪些内容为null以及哪些内容无法执行。
错误可能来自GetAttendanceListOf(),当方法返回IList或IEnumerable时,如果没有结果,则应该返回一个空列表,如果没有结果,它将阻止您每次验证。
答案 2 :(得分:0)
你可以尝试
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();
这将检查您是否对空对象执行Where
操作并过滤掉任何空结果。
答案 3 :(得分:0)
根据@Zdeslav Vojkovic的建议修改GetAttendanceListOf
以返回空列表,如果为null或执行类似的操作:
_AttendedDays = (new AttendanceBAL() .GetAttendanceListOf(q._RollNumber) ?? Enumerator.Empty<typeofrecord>()) .Where(date => date != null) .Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day)) .Distinct() .ToList(),
(你可以在没有额外括号的情况下完成)
答案 4 :(得分:0)
要快速修复,请修改此行
_AttendedDays = new AttendanceBAL()。GetAttendanceListOf(q._RollNumber).Where ...
到此
_AttendedDays =(new AttendanceBAL()。GetAttendanceListOf(q._RollNumber) ?? new List())。其中......