2012-05-02 7 views
6

Deseo ordenar los valores seleccionados ascendiendo a una fecha distinta.seleccione valores tolist() cuando orden por fecha distinta

Por ejemplo, tengo estos valores en mi base de datos.

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 

Desde ID 1 tiene un valor, el 20 de enero y 3 de identificación tiene un valor de 1 de febrero Quiero que estas dos fechas que se seleccionarán a mi lista de valores de fecha distintos. Pero para ID 5 y 6 ambos tienen valor 0. Entonces, si el valor es 0, también quiero que se agregue el valor 0.

Ahora mi linqquery se parece a esto

 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(); 

Pero esta consulta, por supuesto, me da como resultado 35,0,10,0,0,0. Aunque yo quiero que me dé 35,10,0

no quiero no seleccionar valores distintos, por ejemplo si la 1ª y 2 de febrero Febrero tiene los mismos valores. Quiero que se agreguen estos dos valores.

+0

¿Quieres agrupar y ordenar tu lista por valor? – ARZ

+0

@rickard - entonces, si hay un valor distinto de 0 (id 1) y luego otro valor que es 0 (id 2), ¿quieres el que no sea cero? ¿Podría suceder que id 1 = 35, id 2 = 50? Si es así, ¿quieres los dos? –

+0

@Joanna si el valor es igual para la misma fecha (en este caso 0) también quiero que el valor 0 se agregue a la lista(). – rickard

Respuesta

5

Yo sugeriría seleccionar en primer lugar lo que necesita de la primera consulta:

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(); 

En el I anterior se supone que d.Hour corresponde al campo Value en su ejemplo.

Entonces grupo por fecha, ordenado por hora descendente y seleccionar el primer elemento de cada grupo:

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

ACTUALIZACIÓN

Para volver sólo la lista de números enteros para el uso de la propiedad Hora este lugar de la afirmación anterior:

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

ACTUALIZACIÓN 2

¿Puedes probar esto?

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

¿Deseo devolver disticntValues ​​después de haber realizado estos pasos? Cuando trato de obtener este error "No se puede convertir implícitamente el tipo 'System.Collections.Generic.IEnumerable ' a 'System.Collections.Generic.List '. Existe una conversión explícita (¿falta un elenco?) " – rickard

+0

Y si puse .ToList() después .Seleccione (g => g.Primero()). ToList(); me aparece "No se puede convertir implícitamente el tipo 'System.Collections.Generic.List ' a 'System.Collections.Generic.List '" – rickard

+0

@rickard - Sí, los 'distinctValues' deberían ser lo que estás buscando . Si solo desea una propiedad del tipo anónimo, cambie la última línea a '.Seleccione (g => g.Primero(). Hora)' (o cualquier otra propiedad que necesite). La llamada ToList() debería funcionar bien entonces y darle una lista de 'int's - vea la actualización –

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

No quiero elegir valores distintos, solo una fecha distinta. Entonces, si varias fechas, digamos 1 de febrero y 2 de febrero tiene el mismo valor. Este método solo me da uno de estos días. – rickard

2

Quiere decir que quiere que se agrupe en una fecha con las horas agregadas. Si es así, ¿sería algo como esto tal vez?

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(); 

Sólo para explicar

.GroupBy(n => n.Date) 

grupo tendrá los resultados por la fecha por lo que obtendrá una fila distinta por fecha

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

seleccionará y dar forma al resultado. Estamos dando forma a un nuevo objeto. n.Key es la clave con la que trabajó el grupo, por lo que será Date. La segunda propiedad es el agregado de las horas, por lo que cada fecha distinta tendrá sus horas sumadas. Estamos utilizando la palabra clave new para que los resultados se incluyan en un nuevo objeto personalizado. Hemos definido los nombres de las propiedades del nuevo objeto por lo que habrá dos - Date y Hour

+0

Sí, es un resultado como el que estoy buscando. Pero no entiendo todo en este código y me da errores, así que no puedo probarlo correctamente. – rickard

+0

Lo siento, lo escribí en la cima de mi cabeza: qué errores –

+0

"Un cuerpo de consulta debe terminar con una cláusula de selección o una cláusula de grupo" y "No se puede convertir implícitamente el tipo 'System.Collections.Generic.List ' a 'System.Collections.Generic.List ' "y" El tipo de expresión en la cláusula select es incorrecto. La inferencia de tipo falló en la llamada a 'Seleccionar'. " – rickard

Cuestiones relacionadas