2012-01-30 96 views
5

如何對DbSet中的查詢進行排序幷包含也應該排序的子項目。訂購實體框架項目和MVC視圖的子項目

示例:

我有一個調度訂單的模型。

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; } 

隨後的操作方法

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

這不工作,我想是因爲的Include性質。我必須創建一個單獨的視圖模型並映射到它嗎?或者有什麼方法可以在查詢中繞過它嗎?在查詢中有人說new { left = right, etc }有某種語法?

相關的問題:
Ordering Entity Framework sub-items for EditorFor
C# Entity Framework 4.1 Lambda Include - only select specific included values

+0

我不認爲我可以通過匿名類型的視圖,因爲HTML輔助使用拉姆達的。我只是猜測會有一個問題,但也許我應該檢查。 – Benjamin 2012-01-30 19:11:24

+0

同樣的問題:http://stackoverflow.com/questions/8447384/how-to-order-child-collections-of-entities-in-ef?rq=1同樣的問題使用LINQ-to-Entities(類似SQL)語法:http://stackoverflow.com/questions/3981417/how-to-sort-inner-list-that-is-returned-by-entity-framework?rq=1 – 2013-01-24 03:09:49

+0

也http://stackoverflow.com/questions/7522784/ef-4-1-code-first-how-to-order-navigation-properties-when-using-include-and-or 7528266#7528266 – 2014-07-14 16:53:13

回答

3

你是對的,你不能在使用單包括,它並不意味着這樣的。但是您可以使用Orders集合上的OrderBy對視圖內的結果進行排序。此外,你直接返回結果,不應該是return View(db.Weeks...);

+0

oops,是的,它應該說'return View(etc)我會解決這個問題,並嘗試在視圖中進行排序。謝謝。 – Benjamin 2012-01-30 20:26:50

+0

是的,它的工作原理!謝謝! – Benjamin 2012-01-30 20:53:54

+0

請注意,這不是很高效 - 您正在加載無序的項目,在SQL Server中通常會比較慢,然後在內存中重新排序 - 當您可以通過在SQL中對它們進行排序來使用數據庫時首先(見我的答案)。 – 2013-02-22 20:36:36

1

像這樣的東西應該工作:

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

值得一提的是,其他2個解決方案,通過SQL這裏提取數據,然後重新排列的,留作回憶,這是非常浪費在性能方面都在查詢過程和後期處理。這個解決方案通過SQL獨自完成,而不需要額外的內存步驟。

在第二種方法在這裏描述這是可以做到: How to order child collections of entities in EF

像:

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

因此,而不是一個包含語句,沿調出相關數據以匿名對象您要獲取的原始根數據,在該子查詢中排序,最後返回根數據。排序保持不變。扭曲,但它的作品。

要堅持你原來的代碼:

db.Weeks.Select(w => new { W = w, O = w.Orders.OrderBy(o => o.SchedulingOrder) }) 
    .OrderBy(q => q.W.StartDate).Select(q => q.W);