2012-01-30 11 views
5

DbSet'ten bir sorguyu nasıl sıralayabilirim ve ayrıca sıralanması gereken alt öğeleri de dahil edebilirim.Sipariş Varlığı Çerçeve öğeleri ve MVC görünümü için alt öğeler

Örnek:

I zamanlama siparişleri için bir model vardır.

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

Sonra bir eylem yöntemi

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

Bu benim çünkü Include doğası düşünmek çalışmıyor. Ayrı bir görünüm modeli oluşturmalı ve ona harita mı vermeliyim? Ya da sorguda dolanmanın bir yolu var mı? Kişilerin sorguda new { left = right, etc } söyledikleri bir tür sözdizimi var mı?

ilgili sorular:
Ordering Entity Framework sub-items for EditorFor
C# Entity Framework 4.1 Lambda Include - only select specific included values

+0

Ben Html Yardımcıları lambda olarak kullanıyor çünkü Görünüm anonim türleri iletebilirsiniz sanmıyorum. Sadece bununla ilgili bir problem olacağını tahmin ediyorum ama belki kontrol etmeliyim. – Benjamin

+0

Aynı soru: http://stackoverflow.com/questions/8447384/how-to-order-child-collections-of-entities-in-ef?rq=1 LINQ'dan varlıklara (SQL benzeri) sahip aynı soru sözdizimi: http://stackoverflow.com/questions/3981417/how-to-sort-inner-list-that-is-returned-by-entity-framework?rq=1 –

+0

Ayrıca http://stackoverflow.com/questions/7522784/ef-4-1-code-first-how-to-order-navigation-properties-when-using-içerir-ve-veya// 7528266 # 7528266 –

cevap

3

Haklısınız, içeri emir kullanamazsınız şekilde çalışmak amacıyla değil, ekleyin. Ancak sonuçları, koleksiyondaki OrderBy kullanarak toplayabilirsiniz. Ayrıca, bir sonucu doğrudan döndürüyorsanız, return View(db.Weeks...);

+0

oops, evet 'return View (etc)' demek gerekir Bunu düzeltirim ve manzaraya göre sıralamayı deneyeceğim. Teşekkürler. – Benjamin

+0

evet işe yarıyor! Teşekkürler! – Benjamin

+0

Bunun çok performanslı olmadığını unutmayın - SQL Server'da genellikle daha yavaş olan, sonra bunları bellekte yeniden düzenleyen öğeleri sıralanmamış olarak yüklersiniz - veritabanını SQL'de sipariş ederek iyi olduğu için veritabanı kullanıyor olabilirsiniz ilk sırada (cevabıma bakın). –

1

Böyle bir şey çalışması gerekir:

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

diğer 2 çözümler burada SQL ile veri çekme ki, o zaman sorgudan hem esnasında performans açısından çok savurgan olduğu bellek, bir şeyler yeniden düzenlemek fazlalaştı ve işlem sonrası. Bu çözüm, bellekte fazladan bir adım olmaksızın, tek bir seferde SQL yoluyla işleri bir araya getirir.

burada ikinci yaklaşımda açıklandığı gibi Yapılabilir

: How to order child collections of entities in EF

beğendiniz:

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

Bunun yerine bir ifadeyi ekleyin, sen birlikte anonim bir nesnede ilgili verileri çağırmak Getireceğiniz orijinal kök verileri, bu alt sorguda sipariş verin ve son olarak kök verilerini döndürün. Sipariş değişmeden kalır. Twisted ama işe yarıyor.

orijinal kod ile sopa için:

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