2013-04-11 21 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(); 

Phương pháp này, GetAttendanceListOf(q._RollNumber) trong mã trên sẽ trả về một danh sách các bản ghi từ cơ sở dữ liệu hoặc "null" nếu không có hồ sơ hiện tại cho qua "roll-không". Truy vấn LINQ sẽ bị chấm dứt tạo lỗiLàm thế nào để xử lý các giá trị null trong LINQ?

"Giá trị không thể rỗng".

Có cách nào để xử lý lỗi này và chuyển LINQ sang bước tiếp theo không?

+0

Có lẽ bạn chỉ có thể sử dụng 'Where (q => q! = Null) ', để lọc ra các giá trị rỗng? –

+0

Hoặc, nó là "Danh sách những thứ hoặc null", bạn có thể sử dụng một cái gì đó như 'Chọn (l => l == null? Iterable.Empty: l)' –

+0

Nếu bạn có thể, chỉ cần sửa đổi 'GetAttendanceListOf' để trả về sản phẩm nào liệt kê nếu không tìm thấy gì cho 'roll-no' đã cho. – pfyod

Trả lời

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

Vấn đề là chạy Where() trên ví dụ trống. giải pháp khả thi:

1) sửa đổi GetAttendanceListOf để trả lại một danh sách trống nếu không có sự tham dự (ý tưởng tốt nói chung, như null object pattern là rất thường là một cuộc sống tiết kiệm và cho bộ sưu tập, một bộ sưu tập trống thường là ngữ nghĩa tương tự null)
2) nếu bạn không kiểm soát phương thức đó, hãy viết một phương thức mở rộng an toàn sẽ trả về danh sách trống trong trường hợp null, ví dụ

List<AttendanceType> SafeAttendanceList(this AttendanceBALType bal, RollNumber rn) 
{ 
    return bal.GetAttendanceListOf(rn) ?? new List<AttendanceType>(); 
} 

Sau đó gọi nó là:

_AttendedDays = new AttendanceBAL() 
    .SafeAttendanceListOf(q._RollNumber) 
    .Where(date => date != null) 
+0

Đề án phương pháp mở rộng này không hoạt động đối với tôi, nó yêu cầu 2 đối số. Nhưng cảm ơn cho ý tưởng. Tôi đã thực hiện nó theo một cách khác và giải quyết vấn đề của mình. –

+1

Không chắc chắn nếu tôi hiểu đúng, nhưng đối số đầu tiên là 'này AttendanceBAL bal', vì vậy bạn vẫn gọi nó như thể nó có 1 đối số:' bal..GetAttendanceListOf (q._RollNumber) '. Đó là toàn bộ các phương pháp mở rộng –

0

LINQ ToList() sẽ trả về một danh sách trống nếu không có kết quả. Lỗi có thể đến từ nơi khác.

Tôi sẽ recommand bạn sử dụng các phương pháp để tạo đối tượng của bạn, nó sẽ làm cho truy vấn của bạn dễ đọc hơn và để gỡ lỗi. Tôi sẽ recommand rằng bạn làm điều đó trong nhiều bước để xác định những gì đang nhận được null và nơi chính xác nó không thực thi.

Lỗi có thể xuất phát từ GetAttendanceListOf(), khi có phương thức trả về IList hoặc IEnumerable, bạn nên trả về một danh sách trống nếu không có kết quả, nó sẽ ngăn bạn xác nhận hợp lệ mỗi lần nếu nó là null hay không.

0

Bạn có thể thử

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

này kiểm tra mà bạn không làm một hoạt động Where trên một đối tượng null và lọc ra bất kỳ kết quả null.

0

Theo đề nghị của @Zdeslav Vojkovic sửa đổi GetAttendanceListOf trở lại danh sách trống nếu null hoặc làm điều gì đó như:

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

(bạn có thể có thể làm điều đó mà không có ngoặc thêm)

0

Đối với một cách nhanh chóng sửa chữa, sửa dòng này

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

Để

_AttendedDays = (mới AttendanceBAL(). GetAttendanceListOf (q._RollNumber) ?? Danh sách mới()) này .Where ...

+0

đi với giải pháp của Eli Algranti. có vẻ thanh lịch hơn .. –