2012-04-09 19 views
6

Bu iki varlık var. o StartTime var tarafından ayrıca her Class siparişGruplama ve çoklu sıralamalar

var myList = context.Classes 
    .GroupBy(c => c.Course) 
    .OrderByDescending(g => g.Key.StartDate).ToList() 

Ama hiç yönetemez: Ben Course.StartDate tarafından Sahası ve emriyle gruba alabilirsiniz.

var myList = context.Classes 
    .OrderBy(c => c.StartTime) 
    .GroupBy(c => c.Course) 
    .OrderByDescending(g => g.Key.StartDate).ToList() 

Ve hatta bu:

var myList = context.Classes 
    .GroupBy(c => c.Course) 
    .OrderByDescending(g => g.Key.StartDate) 
    .ThenBy(g => g.Select(c => c.StartTime)).ToList() 

Ama Başlama zamanı var tarafından Sınıflar sipariş asla. Bu çalıştı

* aydınlatılması için daha Düzenleme: Bu bir WebService için ve ben bir List<IGrouping<Course, Class>> döndürmesi gerekir ve gerçekten elle liste yaratmadan, bunu yapmanın zarif bir şekilde (yani sadece Linq kullanarak) istiyorum. Tabii ki mümkün olmadıkça.

Herhangi bir yardıma gerek yok (EF kodunu ilk kullanıyorum 4.3 btw).

cevap

2

Eğer imza korumak gerekiyorsa, şu önermek StartTime tarafından düzgün şekilde sipariş edildi. Bu, bulunan siparişi korumak için ToLookup davranışına dayanır ve değişebilir.

+0

Bu muhtemelen en iyi bahistir. 'ToLookup' bir' ILookup döndürür IEnumerable > 'i uygulayan , yani bunu web servisine aktarabilirsiniz (bunu yapmak zorunda kalabilirsiniz, ama bu bir problem olmamalıdır). – SPFiredrake

+0

Bunu hacklenmiş bir çözümle çözdüm, ancak bu çok daha şık. –

2

numaralı listeye, her bir iç içe listenin, belirttiğiniz ek ölçütlerle birlikte sipariş edildiği bir liste listesi olan listesine ihtiyacınız var gibi görünüyor. Course ile gruplandırdığınız için, başlangıç ​​tarihi itibariyle grupları gruplarını sipariş edebilirsiniz, çünkü bir gruptaki her giriş aynı başlangıç ​​tarihine sahip olacaktır. Sonra başlangıç ​​zamanına tarafından sipariş listesine gruplandırılmış elemanlar yansıtabilirsiniz:

var myList = context.Classes 
    .GroupBy(c => c.Course) 
    .OrderByDescending(g => g.Key.StartDate) 
    .Select(g => g.OrderBy(c => c.StartTime).ToList()) 
    .ToList(); 
+0

Sorun gerçekten bir 'List >' listesine dönmem gerekiyor. Bu bir WebServis ve tüketiciyi değiştiremiyorum. Aksi takdirde, bir "foreach" (istemcide group.OrderBy (c => c.StartTime) varyasyonu var, ama ne yazık ki yapamam. –

1

EF aynı SQL bir sıralama içeren bir gruplandırma yapmak mümkün değildir direkt SQL oluşturur beri.

Gruplandırmayı EF kullanarak ve ToList() ile biten bir Linq deyiminde yapmanızı öneririm. Ve Linq To Objects (bellekte) ile ikinci bir Linq Deyimi olarak sıralama yapar.

Nesneler zaten gruplandırılmış olduğu için hızlı çalışmalıdır.

Yani böyle bir şey çalışması gerekir:

var myList = context.Classes 
        .GroupBy(cc => cc.Course) 
        .OrderByDescending(gg => gg.Key.StartDate) 
        .ToArray() // <- stops EF and starts L2O 
        .SelectMany(gg => gg.OrderBy(cc => cc.StartTime)) 
        .ToLookup(cc => cc.Course, cc => cc) 
        .ToList(); 

Bu imza sonucunda bir tür: List<IGrouping<Course, Class>> ve onlara sahip

var myList = context.Classes 
    .GroupBy(c => c.Course).ToList() 
    .OrderByDescending(g => g.Key.StartDate).ToList()