Đây là bước thứ hai của câu hỏi được giải thích here (EF 4.1 code-first: How to load related data (parent-child-grandchild)?). Theo hướng dẫn của @Slauma tôi có thể truy xuất dữ liệu. Mã đầu tiên của tôi là:EF 4.1 mã đầu tiên: Cách đặt hàng thuộc tính điều hướng khi sử dụng Bao gồm và/hoặc Chọn phương pháp?
var model = DbContext.SitePages
.Where(p => p.ParentId == null && p.Level == 1)
.OrderBy(p => p.Order) // ordering parent
.ToList();
foreach (var child in model) { // loading children
DbContext.Entry(child)
.Collection(t => t.Children)
.Query()
.OrderBy(t => t.Order) // ordering children
.Load();
foreach (var grand in child.Children) { // loading grandchildren
DbContext.Entry(grand)
.Collection(t => t.Children)
.Query()
.OrderBy(t => t.Order) // ordering grandchildren
.Load();
}
}
Nó hoạt động, nhưng điều này sẽ gửi nhiều truy vấn đến cơ sở dữ liệu và tôi đang tìm cách thực hiện tất cả trong một truy vấn. Bằng cách hướng dẫn @Slauma 's (giải thích trên diễn đàn) tôi thay đổi truy vấn để này:
var model2 = DbContext.SitePages
.Where(p => p.ParentId == null && p.Level == 1)
.OrderBy(p => p.Order)
.Include(p => p.Children // Children: how to order theme???
.Select(c => c.Children) // Grandchildren: how to order them???
).ToList();
Bây giờ, làm thế nào tôi có thể đặt trẻ em (cháu) khi chọn chúng (chẳng hạn như mã đầu tiên ở trên)?
Hãy xem câu hỏi này: http://stackoverflow.com/questions/4156949/ef4-linq-ordering-parent-and-all-child-collections-with-eager-loading-include. Những gì bạn đang cố gắng làm được gọi là "háo hức tải", và rõ ràng, bạn không thể sử dụng 'OrderBy' với' Bao gồm'. – devuxer
Có, tôi biết về tải háo hức, và nếu bạn nhìn vào mã đầu tiên (được tạo bởi chính tôi) bạn sẽ thấy tôi sử dụng một tuyên bố foreach trên mỗi đối tượng ở mỗi cấp độ (đầu cho trẻ em, và, con cho cháu) như những gì được giải thích trên liên kết chuẩn bị của bạn. nhưng điều này cần thêm truy vấn đối với cơ sở dữ liệu! Tôi đang tìm kiếm một cách để làm điều này tất cả trong một truy vấn, không nhiều hơn nữa! –
Bạn có thể mong muốn tải toàn bộ cấu trúc của bạn, sau đó đặt hàng trong quan điểm của bạn khi họ được yêu cầu? Có hầu như không có lý do tại sao bạn nên bị rò rỉ logic trình bày (đặt hàng) trong logic truy cập dữ liệu của bạn. –