如何在linq中处理空值?

时间:2013-04-11 12:06:30

标签: c# linq select null dynamic-list

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跳转到下一步?

5 个答案:

答案 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())。其中......