2012-01-30 30 views
5

Làm cách nào để sắp xếp truy vấn từ DbSet và bao gồm các mục con cũng cần được sắp xếp.Đặt hàng các mục Khung thực thể và mục con cho chế độ xem MVC

Ví dụ:

Tôi có mô hình để lên lịch đơn hàng.

public class Order 
{ 
    public virtual int Id { get; set; } 
    public virtual int? SchedulingOrder { get; set; } 
    public virtual int? WeekId { get; set; } 
    public virtual Week Week { get; set; } 
} 
public class Week 
{ 
    public virtual int Id { get; set; } 
    public virtual DateTime StartDate { get; set; } 
    public virtual ICollection<Order> Orders { get; set; } 
} 
... 
public DbSet<Week> Weeks { get; set; } 
public DbSet<Order> Orders { get; set; } 

Sau đó, một phương pháp hành động

public ActionResult ShopSchedule() 
{ 
    return View(db.Weeks.OrderBy(w => w.StartDate) 
       .Include(w => w.Orders.OrderBy(o => o.SchedulingOrder)) 
       .ToList()); 
} 

này không hoạt động Tôi nghĩ rằng vì bản chất của Include. Tôi có phải tạo một mô hình xem riêng và bản đồ cho nó không? Hoặc là có một số cách để có được xung quanh nó ngay trong truy vấn? Có một số loại cú pháp mà mọi người nói là new { left = right, etc } trong truy vấn?

câu hỏi liên quan:
Ordering Entity Framework sub-items for EditorFor
C# Entity Framework 4.1 Lambda Include - only select specific included values

+0

Tôi không nghĩ rằng tôi có thể vượt qua các kiểu nặc danh cho View vì Helpers Html sử dụng lambda của. Tôi đoán là sẽ có vấn đề với điều đó nhưng có lẽ tôi nên kiểm tra. – Benjamin

+0

Cùng một câu hỏi: http://stackoverflow.com/questions/8447384/how-to-order-child-collections-of-entities-in-ef?rq=1 Câu hỏi tương tự bằng cách sử dụng LINQ-to-Entities (giống SQL) cú pháp: http://stackoverflow.com/questions/3981417/how-to-sort-inner-list-that-is-returned-by-entity-framework?rq=1 –

+0

Cũng http://stackoverflow.com/questions/7522784/ef-4-1-code-first-how-to-order-navigation-properties-khi-sử dụng-bao gồm-và-hoặc/7528266 # 7528266 –

Trả lời

3

Bạn đang đúng, bạn không thể sử dụng lệnh trong Bao gồm, nó không có nghĩa là để làm việc theo cách đó. Nhưng bạn có thể sắp xếp kết quả trong chế độ xem bằng cách sử dụng OrderBy trên bộ sưu tập Đơn hàng. Ngoài ra, bạn sẽ trả lại kết quả trực tiếp, không được là return View(db.Weeks...);

+0

oops, vâng, nó nên nói 'return View (etc)' Tôi sẽ sửa lỗi đó và thử sắp xếp nó trong khung nhìn. Cảm ơn. – Benjamin

+0

có nó hoạt động! cảm ơn! – Benjamin

+0

Lưu ý rằng điều này không thực hiện được - bạn đang tải các mục không theo thứ tự, thường có thể chậm hơn trong SQL Server, sau đó sắp xếp lại chúng trong bộ nhớ - khi bạn có thể sử dụng cơ sở dữ liệu cho những gì nó tốt bằng cách sắp xếp chúng trong SQL ngay từ đầu (xem câu trả lời của tôi). –

1

Something như thế này nên làm việc:

public ActionResult ShopSchedule() 
{ 
    var vw = db.Weeks.OrderBy(w => w.StartDate) 
       .Include(w => w.Orders) 
       .ToList(); 
    vw.Orders = vw.Orders.OrderBy(o => o.SchedulingOrder).ToList() 
    return view(vw); 
} 
3

Nó đáng chú ý là 2 giải pháp khác ở đây kéo dữ liệu thông qua SQL, sau đó sắp xếp lại mọi thứ trong bộ nhớ, mà là rất lãng phí về hiệu suất trong cả hai truy vấn và sau xử lý. Giải pháp này nhận được mọi thứ trong một lần qua SQL một mình, mà không cần thêm bước trong bộ nhớ.

Nó có thể được thực hiện như mô tả trong phương pháp thứ hai ở đây: How to order child collections of entities in EF

Giống như:

db.VendorProducts.Select(p => 
    new { Product = p, S = p.Schedules.OrderBy(s => s.From) }) 
    .FirstOrDefault(q => q.Product.Id == id).Product 

Vì vậy, thay vì một Bao gồm tuyên bố, bạn gọi lên các dữ liệu có liên quan trong một đối tượng ẩn danh cùng với dữ liệu gốc ban đầu bạn sẽ tìm nạp, đặt nó trong truy vấn con đó và cuối cùng trả về dữ liệu gốc. Thứ tự vẫn còn nguyên vẹn. Xoắn nhưng nó hoạt động.

Để gắn bó với mã ban đầu của bạn:

db.Weeks.Select(w => new { W = w, O = w.Orders.OrderBy(o => o.SchedulingOrder) }) 
    .OrderBy(q => q.W.StartDate).Select(q => q.W); 
Các vấn đề liên quan