2012-03-29 21 views
5

Estoy tratando de definir una forma estándar de agrupar por año, por mes, por día, por hora, etc ...Entity Framework. Grupo SQL por al grupo EF Por

Al leer algunos documentos SQL parece la forma más eficiente sería utilizar:

GROUP BY dateadd(month, datediff(month, 0, CreatedDate), 0) 

Nota el "mes", "año", ...

que luego trató de replicar esta usando:

.GroupBy(x => SqlFunctions.DateAdd("month", SqlFunctions.DateDiff("month", 0, x.Created), 0)) 

.GroupBy(x => EntityFunctions.AddMonths(EntityFunctions.DiffMonths(0, x.Created))) 

Sin embargo, ambas expresiones no se pudieron compilar ...

¿Y no estoy seguro de si esta es la manera de hacerlo?

¿Cómo puedo replicar correctamente esa línea de código SQL en EF?

Respuesta

5

No entiendo ¿Por qué querrías usar el sql estándar para hacerlo de cualquier forma, sin embargo esto se puede hacer fácilmente usando LINQ y sería más estándar, agrupando por un tipo anónimo por ejemplo como este :

.GroupBy(x => new 
       { 
        month = x.CreatedDate.Month, 
        year = x.CreatedDate.Year, 
        ... 
       }); 
+0

Sí, tengo que funcionar. Pero si no me equivoco al usar algo como lo publiqué, tiene un mejor rendimiento, ¿no? Estaba leyendo lo siguiente: http://weblogs.sqlteam.com/jeffs/archive/2007/09/10/group-by-month-sql.aspx ... –

+0

Esta es la forma en que estaba tratando de encontrar una manera de Replicar ese código SQL usando EntityFunctions ... Y al mismo tiempo crear una forma estándar de agrupar por años, por meses, por días, por horas, ... Solo necesitaría cambiar AddYears por AddMonths, para ... –

+2

No tiene ningún beneficio de rendimiento. La publicación a la que se ha vinculado solo indica que es más fácil trabajar con Sql. No veo que haya tanto beneficio haciéndolo de esa manera con Entity Framework. .NET no tiene las mismas limitaciones que Sql. – cadrell0