2012-03-29 2 views
5

Sto cercando di definire un modo standard per raggruppare per anno, per mese, per giorno, per ora, ecc ...Entity Framework. Gruppo SQL Da Gruppo EF Da

Leggendo alcuni documenti SQL sembra il modo più efficiente sarebbe quella di utilizzare:

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

Annotare il "mese", "anno", ...

ho poi cercato di replicare questo utilizzando:

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

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

Tuttavia, entrambe le espressioni non sono riuscite a compilare ...

E non sono sicuro se questo è il modo di farlo?

Come posso replicare correttamente quella riga di codice SQL in EF?

risposta

5

Non capisco Perché si vuole utilizzare lo SQL standard per fare questo il modo, ma questo può essere fatto facilmente usando LINQ e sarebbe più serie, il raggruppamento per un tipo anonimo per esempio come questo :

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

Sì, ho funzionato. Ma se non sbaglio, uso qualcosa che ho pubblicato ha una performance migliore, no? Stavo leggendo il seguente: http://weblogs.sqlteam.com/jeffs/archive/2007/09/10/group-by-month-sql.aspx ... –

+0

Questo è il modo che stavo cercando di trovare un modo per replicare quel codice SQL utilizzando EntityFunctions ... E allo stesso tempo creare un modo standard per raggruppare per anni, per mesi, per giorni, per ore, ... Avrei solo bisogno di cambiare AddYears per AddMonths, per ... –

+2

Non ha alcun vantaggio in termini di prestazioni. Il post che hai collegato afferma semplicemente che è più facile lavorare con Sql. Non vedo che ci sia un grosso vantaggio in questo modo con Entity Framework. .NET non ha le stesse limitazioni di Sql. – cadrell0