2012-05-10 19 views
13

Ho una tabella con le seguenti 3 colonne, ID, ShortCode, UploadDate.Gruppo LINQ per ordine gruppi di risultati

Desidero utilizzare LINQ per raggruppare i risultati in base allo shortcode (e conservare tutti i risultati), quindi ordinare questi gruppi e restituire un elenco.

Ho il seguente:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession) 
.ToList<PDFDocument>(). 
GroupBy(b=>b.ShortCode) 
.SelectMany(b=>b).ToList<PDFDocument>() 

voglio tornare tutti i risultati, raggruppati per codice funzione, gli elementi all'interno di ogni gruppo ordinato secondo UploadDate ei gruppi ordinati in modo quello che ha il documento più recente in esso primo.

Qualcuno sa se questo è possibile?

risposta

31

Prova

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession) 
    .AsEnumerable() 
    .OrderByDescending(d => d.UploadDate) 
    .GroupBy(d => d.ShortCode) 
    .SelectMany(g => g) 
    .ToList(); 

Questo dovrebbe

  • ordinare gli articoli per data di caricamento (discendente in modo più recente)
  • Poi li gruppo da breve codice - quindi all'interno di ogni gruppo gli articoli sono ancora ordinati
  • I gruppi sono ancora in desc Per finire, quindi nessun bisogno di ordinare ancora
  • Infine concatenare i risultati in un unico elenco

Se le prestazioni sono un problema che molti meglio a fare

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession) 
    .AsEnumerable() 
    .GroupBy(d => d.ShortCode) 
    .Select(g => g.OrderByDescending(d => d.UploadDate)) 
    .OrderByDescending(e => e.First().UploadDate) 
    .SelectMany(e => e) 
    .ToList(); 

che ordina il contenuto di ogni raggruppa separatamente invece di ordinare prima tutto e poi raggruppare.

+0

Grazie, questo fa esattamente quello che volevo. – Ketchup

+1

Mi chiedevo l'ordine di mettere "OrderBy" + "GroupBy" + "OrderBy" e questo risponde perfettamente – EdmundYeung99

+0

Questo mi sta restituendo entità di tipo List, ma voglio che sia di tipo group, Errore del compilatore sono get is Impossibile convertire implicitamente il tipo 'System.Collections.Generic.List ' in 'System.Collections.Generic.IEnumerable >'. Esiste una conversione esplicita (ti manca un cast?) –

5

Infatti, non si desidera raggruppare in base al codice funzione, si desidera ordinare da essi. Così la seguente query dovrebbe fare il trucco:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession) 
.ToList() 
.OrderBy(b => b.ShortCode) 
.ThenBy(b => b.UploadDate) 
.ToList() 

Modifica Se davvero si vuole utilizzare un GroupBy, è possibile farlo in questo modo:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession) 
.ToList() 
.GroupBy(b => b.ShortCode) 
.SelectMany(grouping => grouping.OrderBy(b => b.UploadDate)) 
.ToList() 

Ma io scoraggiarlo. Non ha senso creare gruppi se non vuoi gruppi in primo luogo!

Seconda modifica

Non ho avuto che volevi i gruppi in ordine di UpdateTime troppo. Si complica un po 'la query:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession) 
.ToList() 
.GroupBy(b => b.ShortCode) 
.Select(grouping => grouping.OrderByDescending(b => b.UploadDate)) 
.OrderByDescending(grouping => grouping.First().UploadDate) 
.SelectMany(grouping => grouping) 
.ToList() 
+0

Può la persona che downvoted almeno spiegare perché lo ha fatto? – Falanwe

+0

In questo ordine verranno inseriti sia gli elementi all'interno del gruppo per data? E poi ordina anche i risultati raggruppati? – Ketchup

+0

Tutti gli elementi con il primo codice breve apparteranno all'elenco risultante, ordinati per UpdateTime, quindi tutti gli elementi con il secondo codice corto, ordinati allo stesso modo e così via. Il risultato sarà simile a quello che otterresti in Excel quando ordini i tuoi elementi principalmente da una colonna, poi da un altro. – Falanwe