C# 如何在linq中处理空值?
上述代码中的方法GetAttendanceListOf(q.\u RollNumber)将从数据库返回记录列表,如果传递的“roll no”没有记录,则返回“null”。linq查询将被终止并生成错误 “值不能为空” 是否有办法处理此错误并使LINQ跳转到下一步C# 如何在linq中处理空值?,c#,linq,select,null,dynamic-list,C#,Linq,Select,Null,Dynamic List,上述代码中的方法GetAttendanceListOf(q.\u RollNumber)将从数据库返回记录列表,如果传递的“roll no”没有记录,则返回“null”。linq查询将被终止并生成错误 “值不能为空” 是否有办法处理此错误并使LINQ跳转到下一步 recordsList.ListOfRecords = new StudentRecordsBAL() .GetStudentsList()
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();
问题在于在空实例上运行Where()
。可能的解决办法:
1) 修改GetAttendanceListOf
以在没有出席时返回一个空列表(一般来说,这是一个好主意,因为它通常是一个救命稻草,对于集合,空集合通常在语义上类似于null)2) 如果您不控制该方法,请编写一个安全的扩展方法,如果为null,该方法将返回空列表,例如
_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(),
如果没有结果,Linq ToList()将返回一个空列表。
错误可能来自其他地方
我建议您使用方法来创建对象,这将使您的查询更易于阅读和调试。我建议您分多个步骤来确定什么是null,以及它在哪里无法执行
错误可能来自GetAttendanceListOf(),当方法返回IList或IEnumerable时,如果没有结果,则应返回空列表,这将阻止您每次验证它是否为null 你可以试试
_AttendedDays = new AttendanceBAL()
.SafeAttendanceListOf(q._RollNumber)
.Where(date => date != null)
这将检查您是否未对空对象执行
Where
操作,并过滤掉任何空结果。如@Zdeslav Vojkovic建议,修改GetAttendanceListOf
以在空时返回空列表,或执行类似操作:
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();
_出席天数=(新的出席人数表()
.GetAttendanceListOf(q._RollNumber)??枚举器.Empty()
.Where(日期=>date!=null)
.选择(日期=>新日期时间(日期.\u日期.年,日期.\u日期.月,日期.\u日期.日))
.Distinct()
.ToList(),
(您可能不需要额外的括号就可以完成此操作)要快速修复此问题,请修改此行 _AttendedDays=新建AttendanceBAL().GetAttendanceListOf(q.\U RollNumber)。其中 对此 _AttendedDays=(新建AttendanceBAL().GetAttendanceListOf(q.\U RollNumber)?新建列表())。其中
也许你可以使用
Where(q=>q!=null)
,过滤掉空值?或者,如果可以的话,你可以使用Select(l=>l==null?Iterable.Empty:l)
,只要修改GetAttendanceListOf
以返回空列表,如果没有为给定的“roll no”找到任何内容。此扩展方法方案不适用于我,它需要2个参数。但是谢谢你的主意。我以其他方式实现了它并解决了我的问题。不确定我是否理解正确,但第一个参数是此AttendanceBAL
,因此您仍然像调用它一样调用它,好像它有一个参数:bal..GetAttendanceListOf(q.\u RollNumber)
。这就是扩展方法的全部要点
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();
_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(),