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

4

5 回答 5

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(),

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

1)如果没有出席,修改GetAttendanceListOf为返回一个空列表(一般来说是个好主意,因为空对象模式通常是救命稻草,对于集合,空集合通常在语义上类似于空)
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)
于 2013-04-11T12:12:21.047 回答
0

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

我建议您使用方法来创建对象,这将使您的查询更易于阅读和调试。我建议您分多个步骤来确定什么是空的,以及它在哪里执行失败。

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

于 2013-04-11T12:13:02.357 回答
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对空对象执行操作并过滤掉任何空结果。

于 2013-04-11T12:14:45.137 回答
0

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

_AttendedDays = (新的出勤率()
    .GetAttendanceListOf(q._RollNumber) ?? Enumerator.Empty<typeofrecord>())
    .Where(date => date != null)
    .Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day))
    。清楚的()
    .ToList(),

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

于 2013-04-11T12:26:38.887 回答
0

为了快速修复,修改此行

_AttendedDays = new AttendanceBAL().GetAttendanceListOf(q._RollNumber).Where...

对此

_AttendedDays = (new AttendanceBAL().GetAttendanceListOf(q._RollNumber) ??new List() ).Where...

于 2013-04-11T12:33:03.250 回答