2010-07-06 49 views
8

Tôi đã có cấu trúc bảng thực sự cơ bản này:LINQ to Entities - tải háo hức sử dụng Bao gồm()

dbo.tblCategory
dbo.tblQuestion (nhiều đến một mối quan hệ với tblCategory)
dbo.tblAnswer (nhiều mối quan hệ với tblQuestion)

Vì vậy, về cơ bản, những gì tôi đang cố gắng làm là khi tôi tải một danh mục, tôi cũng muốn tải tất cả các câu hỏi và tất cả các câu trả lời.

Bây giờ, tôi đã có thể làm điều này bằng cách sử dụng đoạn mã sau:

public tblCategory Retrieve(int id) 
{ 
    using (var entities = Context) 
    { 
     var dto = 
      (from t in entities.tblCategory.Include("tblQuestion") 
              .Include("tblQuestion.tblAnswers")  
       where t.Id == id 
       select t).FirstOrDefault(); 

      return entities.DetachObjectGraph(dto); 
     } 
    } 
} 

Tuy nhiên, tôi không hoàn toàn say mê với điều này; nếu tên mối quan hệ thay đổi trong mô hình của tôi; Tôi sẽ không gặp lỗi khi xây dựng dự án. Lý tưởng nhất, tôi muốn sử dụng một biểu thức lambda; một cái gì đó như thế này:

public tblCategory Retrieve(int id) 
{ 
    using (var entities = Context) 
    { 
     var dto = 
      (from t in entities.tblCategory.Include(t => t.tblQuestion) 
      where t.Id == id 
      select t).FirstOrDefault(); 

     return entities.DetachObjectGraph(dto); 
    } 
} 

Bây giờ, với đoạn mã trên; Tôi đang bị mắc kẹt về cách đi sâu vào bảng Hỏi & Đáp. Bất kỳ ý tưởng về những gì tôi có thể sử dụng cho một biểu thức lambda cho điều này?

+0

LINQ to Entities in .NET 4.0 hỗ trợ tải chậm (được bật theo mặc định) theo như tôi biết. Bạn không cần phải bận tâm về điều này sau đó. =) – Jens

+0

Giả sử chúng tôi đang ở trên 4.0. Chúng tôi vẫn đang sử dụng 3.5 trong thời gian này =) –

+0

có thể trùng lặp với [Entity Framework .Include() với kiểm tra thời gian biên dịch?] (Http://stackoverflow.com/questions/2921119/entity-framework-include-with- biên dịch-thời gian kiểm tra) –

Trả lời

7

OK; Tôi có thể làm việc này, với một số trợ giúp từ here.

Về cơ bản, tôi cần phải làm điều này:

public tblCategory Retrieve(int id) 
{ 
    using (var entities = Context) 
    { 
     var dto = 
      (from t in entities.tblCategory.Include(t => t.tblQuestion) 
              .Include(t => t.tblQuestion.First().tblAnswer) 
      where t.Id == id 
      select t).FirstOrDefault(); 

     return entities.DetachObjectGraph(dto); 
    } 
} 

Từ liên kết ở trên, tôi chỉ có thể dereference tblAnswers vào các mặt hàng cá nhân của bộ sưu tập các câu hỏi. Ở đây tôi đã chọn để dereference tblAnswers trên mục đầu tiên của bộ sưu tập. Trong thực tế, biểu thức lambda này chỉ được sử dụng để tạo ra đường dẫn đặc tính “tblQuestion.tblAnswers”, sẽ háo hức nạp các câu trả lời của tất cả các câu hỏi.

Vì vậy, mặc dù có vẻ như tôi chỉ lấy câu trả lời cho câu hỏi đầu tiên, tôi thực sự đang kéo tất cả các câu trả lời cho tất cả các câu hỏi.

+6

Nếu bạn không thể sử dụng 'Include()' với các biểu thức lambda, hãy thêm 'using System.Data.Entity;'. ([src] (http://stackoverflow.com/a/21005478/1937994)) – gronostaj

+0

Hoặc: 'sử dụng Microsoft.Data.Entity;' –

Các vấn đề liên quan