2013-04-11 2 views
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) в коде выше будет возвращать список записей из базы данных или «нулевой», если нет записи, присутствующей на пройденном «рулонной-нет». Запрос linq будет прерван при генерации ошибкиКак обрабатывать нулевые значения в linq?

«Значение не может быть пустым».

Есть ли способ справиться с этой ошибкой и сделать переход LINQ к следующему шагу?

+0

Возможно, вы можете просто использовать 'Where (q => q! = Null)', чтобы отфильтровать нули? –

+0

Или это «Список вещей или нуль», вы можете использовать что-то вроде 'Select (l => l == null? Iterable.Empty: l)' –

+0

Если вы можете, просто измените 'GetAttendanceListOf', чтобы вернуть пустое если ничего не найдено для данного «roll-no». – pfyod

ответ

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() на экземпляре null. Возможные решения:

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) 
+0

Эта схема метода расширения не сработала для меня, она потребовала 2 аргумента. Но спасибо за эту идею. Я реализовал его каким-то другим способом и решил проблему. –

+1

Не уверен, правильно ли я понял, но первым аргументом является 'this AttendanceBAL bal', поэтому вы все равно называете его так, как будто он имеет 1 аргумент:' bal..GetAttendanceListOf (q._RollNumber) '. В этом весь смысл методов расширения –

0

Linq ToList() возвращает пустой список, если нет результатов. Ошибка может произойти из других источников.

Я бы рекомендовал вам использовать методы для создания ваших объектов, это упростит чтение и отладку вашего запроса. Я бы рекомендовал вам сделать это несколькими шагами, чтобы определить, что получает нуль и где именно он не может выполнить.

Ошибка может возникнуть из GetAttendanceListOf() при наличии методов, возвращающих IList или IEnumerable, вы должны вернуть пустой список, если результатов нет, это не позволит вам проверять каждый раз, если это null или нет.

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 операцию на нулевой объект и отфильтровать нулевые результаты.

0

Как было предложено @Zdeslav Vojkovic изменить GetAttendanceListOf вернуть пустой список, если нуль или сделать что-то вроде:

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

(вы могли бы быть в состоянии сделать это без дополнительных скобок)

0

Для быстрого исправить, измените эту строку

_AttendedDays = новый AttendanceBAL(). GetAttendanceListOf (q._RollNumber) .где ...

Для этого

_AttendedDays = (новый AttendanceBAL(). GetAttendanceListOf (q._RollNumber) ?? нового списка()) .гда ...

+0

идти с решением Эли Альгранти. похоже более элегантный .. –

Смежные вопросы