2012-05-02 14 views
6

Desidero ordinare i valori selezionati in una data diversa ascendente.selezionare valori tolist() in caso di ordinata data distinta

Ad esempio, ho questi valori nel mio database.

ID | Value | Date 
1 | 35 | 2012/01/20 
2 | 0  | 2012/01/20 
3 | 10 | 2012/02/01 
4 | 0  | 2012/02/01 
5 | 0  | 2012/03/01 
6 | 0  | 2012/03/01 

Dal ID 1 ha un valore il 20 gennaio e ID 3 ha un valore sul 1 febbraio voglio queste due date per essere selezionati alla mia lista di valori di data distinti. Ma per ID 5 e 6 entrambi hanno valore 0. Quindi se il valore è 0 voglio anche il valore 0 da aggiungere.

Ora il mio linqquery assomiglia a questo

 var totalHours = (from u in context.Users 
          join r in context.Reports on u.Id equals r.UserId 
          join w in context.Weeks on r.Id equals w.ReportId 
          join d in context.Days on w.DayId equals d.Id 
          orderby d.Date ascending 
          where r.weekNr.Equals(currentWeek) 
          select d.Hour).ToList(); 

Ma questa domanda naturalmente mi dà 35,0,10,0,0,0 come risultato. Anche se desidero darmi 35,10,0

Non voglio selezionare valori distinti, diciamo se il 1 ° febbraio e il 2 febbraio hanno gli stessi valori. Voglio che entrambi questi valori siano aggiunti.

+0

si desidera raggruppare e ordinare la lista in base al valore? – ARZ

+0

@rickard - quindi se c'è un valore diverso da 0 (id 1) e quindi un altro valore che è 0 (id 2) vuoi solo quello non zero? Potrebbe accadere che id 1 = 35, id 2 = 50? Se è così, vuoi entrambi? –

+0

@Joanna se il valore è uguale per la stessa data (in questo caso 0) voglio anche il valore 0 da aggiungere alla lista(). – rickard

risposta

5

vorrei suggerire di selezionare prima cosa avete bisogno dalla prima query:

var totalHours = (from u in context.Users 
          join r in context.Reports on u.Id equals r.UserId 
          join w in context.Weeks on r.Id equals w.ReportId 
          join d in context.Days on w.DayId equals d.Id 
          orderby d.Date ascending 
          where r.weekNr.Equals(currentWeek) 
          select new {id = r.UserId, hour = d.Hour, date = d.Date}).ToList(); 

Nel I al di sopra supponiamo che d.Hour corrisponda al campo Value nell'esempio.

Poi gruppo per data, l'ordine per ora discendente e selezionare la prima voce di ogni gruppo:

var distinctValues = totalHours 
       .GroupBy(th => th.Date) 
       .OrderByDescending(v => v.Max(o => o.Hour)) 
       .Select(g => g.First()); 

UPDATE

Per tornare solo la lista di interi per l'utilizzo di proprietà Ora questo posto della dichiarazione di cui sopra:

var distinctValues = totalHours 
       .GroupBy(th => th.Date) 
       .OrderByDescending(v => v.Max(o => o.Hour)) 
       .Select(g => g.First().Hour) 
       .ToList(); 

UPDATE 2

Puoi provare questo?

var distinctValues = totalHours 
       .GroupBy(th => th.Date) 
       .Select(g => g.OrderByDescending(e => e.Hour)) 
       .Select(g => g.First().Hour) 
       .ToList(); 
+0

Voglio restituire disticntValues ​​dopo aver eseguito questi passaggi? Quando provo a ottenere questo errore "Impossibile convertire implicitamente il tipo 'System.Collections.Generic.IEnumerable ' a 'System.Collections.Generic.List '. Esiste una conversione esplicita (ti manca un cast?) " – rickard

+0

E se metto .ToList() dopo .Select (g => g.First()). ToList(); Ottiene "Impossibile convertire implicitamente il tipo 'System.Collections.Generic.List ' a 'System.Collections.Generic.List '" – rickard

+0

@rickard - Sì, il 'distinctValues' dovrebbe essere quello che stai cercando . Se si desidera una sola proprietà dal tipo anonimo, modificare l'ultima riga in '.Seleziona (g => g.First(). Hour)' (o qualsiasi altra proprietà necessaria). La chiamata ToList() dovrebbe funzionare bene e darti una lista di 'int's - vedi l'aggiornamento –

0
var totalHours = (from u in context.Users 
          join r in context.Reports on u.Id equals r.UserId 
          join w in context.Weeks on r.Id equals w.ReportId 
          join d in context.Days on w.DayId equals d.Id 
          orderby d.Date ascending 
          where r.weekNr.Equals(currentWeek) 
          select d.Hour).Distinct().OrderByDescending(n => n).ToList(); 
+0

Non voglio selezionare valori distinti, solo date distinte. Quindi se più date, ad esempio 1 febbraio e 2 febbraio hanno lo stesso valore. Questo metodo mi dà solo uno di questi giorni. – rickard

2

Vuoi dire che lo vuoi raggruppato in data con le ore aggregate. Se fosse così sarebbe forse qualcosa del genere?

var totalHours = (from u in context.Users       
join r in context.Reports on u.Id equals r.UserId       
join w in context.Weeks on r.Id equals w.ReportId       
join d in context.Days on w.DayId equals d.Id       
orderby d.Date ascending       
where r.weekNr.Equals(currentWeek)       
).GroupBy(n => n.Date).Select(n => new { Date = n.Key, Hour = Sum(x => x.Hour) }).ToList(); 

solo spiegare

.GroupBy(n => n.Date) 

gruppo avrà i risultati per la data in modo da otterrete una riga distinta per ogni data

.Select(n => new { Date = n.Key, Hour = Sum(x => x.Hour) }) 

selezionerà e modellare il risultato. Stiamo dando forma a un nuovo oggetto. n.Key è la chiave su cui il gruppo ha lavorato, quindi sarà Date. La seconda proprietà è l'aggregato delle ore in modo che ogni data distinta avrà le sue ore riassunte. Stiamo utilizzando la parola chiave new in modo che i risultati vengano inseriti in un nuovo oggetto personalizzato. Abbiamo definito i nomi delle proprietà del nuovo oggetto così non ci saranno due - Date e Hour

+0

Sì, è un risultato come quello che sto cercando. Ma non capisco tutto in questo codice e mi dà errori quindi non sono in grado di testarlo correttamente. – rickard

+0

scusate l'ho scritto in cima alla mia testa - quali errori –

+0

"Un corpo della query deve terminare con una clausola select o una clausola di gruppo" e "Impossibile convertire implicitamente il tipo 'System.Collections.Generic.List ' a 'System.Collections.Generic.List ' "e" Il tipo di espressione nella clausola select non è corretto. Tipo di inferenza non riuscito nella chiamata a "Seleziona". " – rickard

Problemi correlati