8

Đây là biểu hiện của tôi:EF Lambda: Các Bao gồm biểu thức đường dẫn phải đề cập đến một bất động sản chuyển hướng

Course course = db.Courses 
    .Include(
    i => i.Modules.Where(m => m.IsDeleted == false) 
     .Select(s => s.Chapters.Where(c => c.IsDeleted == false)) 
).Include(i => i.Lab).Single(x => x.Id == id); 

tôi biết nguyên nhân là Where(m => m.IsDeleted == false) trong phần Modules, nhưng tại sao nó gây ra lỗi? Quan trọng hơn, làm thế nào để sửa nó?

Nếu tôi xóa mệnh đề where nó hoạt động tốt nhưng tôi muốn lọc ra các mô-đun đã xóa.

Trả lời

11

.Include được sử dụng để háo hức tải các thực thể liên quan từ db. I E. trong trường hợp của bạn đảm bảo dữ liệu cho các mô-đun và phòng thí nghiệm được tải với khóa học.

Biểu thức lamba bên trong .Include phải cho biết Khung thực thể có liên quan đến bảng bao gồm.

Trong trường hợp của bạn, bạn cũng đang cố gắng thực hiện điều kiện bên trong bao gồm, đó là lý do bạn nhận được lỗi.

Dường như câu hỏi của bạn là:

Tìm khóa phù hợp với một id nhất định, với các module liên quan và phòng thí nghiệm. Miễn là mô-đun và chương phù hợp không bị xóa.

Nếu điều đó là đúng, thì đây sẽ làm việc:

Course course = db.Courses.Include(c => c.Modules) 
          .Include(c => c.Lab) 
          .Single(c => c.Id == id && 
             !c.Module.IsDeleted && 
             !c.Chapter.IsDeleted); 
+3

Điều này thực sự sai. Bạn sẽ tìm nạp tất cả các mục từ bảng Mô-đun và Lab. –

3

nhưng tại sao nó gây ra lỗi?

Tôi có thể tưởng tượng rằng đôi khi nhóm EF hối tiếc ngày giới thiệu cú pháp Include này. Các biểu thức lambda gợi ý rằng bất kỳ biểu thức linq hợp lệ nào có thể được sử dụng để khéo léo thao tác tải mong muốn. Nhưng quá tệ, không phải vậy. Như tôi đã giải thích here lambdas chỉ phục vụ như một đối số chuỗi cải trang thành phương thức "thực" Include cơ bản.

làm cách nào để khắc phục sự cố?

xuất sắc nhất sẽ được chiếu vào lớp khác (chẳng hạn, một DTO)

db.Courses.Select(x => new CourseDto { 
    Id = x.Id, 
    Lab = x.Lab, 
    Modules = x.Modules.Where(m => !m.IsDeleted).Select(m => new ModuleDto { 
     Moudle = m, 
     Chapters = x.Chapters.Where(c => c.IsDeleted) 
    } 
}).Single(x => x.Id == id); 

nhưng điều đó có thể là một thay đổi lớn đối với bạn.

Một tùy chọn khác là tắt tải chậm và tải trước các Mô-đun và Chương không bị xóa của khóa học trong ngữ cảnh theo số Load command. Sửa lỗi mối quan hệ sẽ điền vào các thuộc tính điều hướng phù hợp. Include cho Lab sẽ hoạt động bình thường.

Nhân tiện, có một change request cho tính năng này.