2010-11-15 9 views
17

Estoy intentando hacer un grupo Linq solo en la parte de fecha de un campo de fecha y hora.LINQ to Entities group-by failure using .date

Este enunciado de linq funciona pero se agrupa por fecha y hora.

var myQuery = from p in dbContext.Trends 
      group p by p.UpdateDateTime into g 
      select new { k = g.Key, ud = g.Max(p => p.Amount) }; 

Cuando ejecuto esta declaración al grupo con sólo la fecha de recibo el siguiente error

var myQuery = from p in dbContext.Trends 
      group p by p.UpdateDateTime.Date into g //Added .Date on this line 
      select new { k = g.Key, ud = g.Max(p => p.Amount) }; 

El tipo de miembro 'Fecha' especificado no está soportado en LINQ a Entidades. Solo se admiten inicializadores, miembros de entidades y propiedades de navegación de entidades.

¿Cómo puedo hacer un grupo por la fecha y no la fecha y la hora?

+0

Eso es raro porque ¡el mismo código exacto funciona para Linq a SQL! – azamsharp

Respuesta

32

Utilice la EntityFunctions.TruncateTime método:

var myQuery = from p in dbContext.Trends 
      group p by EntityFunctions.TruncateTime(p.UpdateDateTime) into g 
      select new { k = g.Key, ud = g.Max(p => p.Amount) }; 
+0

Esto funciona. Es un poco más limpio que la otra solución que también funciona. ¡Gracias! – twamn

+0

Funciona en todos los casos, excepto cuando se usan diferentes zonas horarias. Luego, la agrupación también se realiza en zonas horarias. He publicado una mala solución aquí y me gustaría que algunos me ayuden a hacer el código más limpio: [.NET LINQ al grupo de entidades por fecha (día)] (http://stackoverflow.com/questions/11016703/net-linq-to-entities -grupo por fecha-día) – Zeezer

+0

Gracias. Estuve buscando esto por días. Eres el hombre – Dudipoli

0

No puede usar DateTime.Date en una consulta Linq-to-Entities. O bien tiene un grupo por los campos explícitamente o crea un campo Date en la base de datos. (Tuve el mismo problema: utilicé un campo Date en el DB, nunca miré hacia atrás).

5

Posible solución here que sigue el patrón:

var q = from i in ABD.Listitem 
    let dt = p.EffectiveDate 
    group i by new { y = dt.Year, m = dt.Month, d = dt.Day} into g 
    select g; 

Por lo tanto, para su búsqueda [probado]:

var myQuery = from p in dbContext.Trends 
     let updateDate = p.UpdateDateTime 
     group p by new { y = updateDate.Year, m = updateDate.Month, d = updateDate.Day} into g 
     select new { k = g.Key, ud = g.Max(p => p.Amount) }; 
+0

Esto funciona con un pequeño mod. "into g" debe agregarse al final de la tercera línea. ¡Gracias! – twamn

+0

Pero yo diría que la solución de adrift es la mejor si está utilizando EF 4.0. No conocía previamente las utilidades de EntityFunctions. –

Cuestiones relacionadas