2013-04-12 9 views
6

Sto usando ASP.NET v4.5 e LINQ to entità sto cercando di gruppo miei dati per settimana usando il codice seguenteLINQ to Entities gruppo entro la settimana numero

var groupedByWeek = salesOrdersList 
    .GroupBy(i => i.DueDate.AddDays(-(int)i.DueDate.DayOfWeek)); 

Comunque io sono sempre una " schermo giallo della morte" con l'errore:

LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.

Preferirei mettere

var groupedByWeek = salesOrdersList.GroupBy(i => i.DueDate.WeekNumber); 

Ma la vita non è così facile!

Qualcuno sa come utilizzare i numeri delle settimane con Linq alle entità?

+0

Qual è il problema con esso? –

+0

LINQ to Entities non riconosce il metodo metodo 'System.DateTime AddDays (Double)' e questo metodo non può essere convertito in un'espressione di archivio. –

+0

Cosa succede se lo si cambia in 'i => i.DueDate - TimeSpan.FromDays (i.DueDate.DayOfWeek)' o 'i => i.DueDate - new TimeSpan (i.DueDate.DayOfWeek, 0, 0, 0) '? –

risposta

14

Uso SqlFunctions.DatePart() metodo:

var groupedByWeek = salesOrdersList.GroupBy(i => SqlFunctions.DatePart("week", i.DueDate)); 

Si aggiungerà la funzione di chiamata DATEPART SQL in query SQL generato.

0

Oppure è possibile ottenere la data del primo giorno della settimana, quindi raggruppare in base a tale data.

Per ottenere la data del primo giorno della settimana. è possibile utilizzare questo codice:

public static class DateTimeExtensions 
{ 
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) 
    { 
     int diff = dt.DayOfWeek - startOfWeek; 
     if (diff < 0) 
     { 
      diff += 7; 
     } 
     return dt.AddDays(-1 * diff).Date; 
    } 
} 

allora è possibile raggruppare per la prima data della settimana come questa:

var groupedByWeek = salesOrdersList.GroupBy(i => i.DueDate.StartOfWeek(DayOfWeek.Monday)); 
+0

Hmm Mi piace questa soluzione, ma ottengo questo err: r System.NotSupportedException: LINQ alle Entità non riconosce il metodo 'System.DateTime StartOfWeek (System.DateTime, System.DayOfWeek)' metodo, e questo metodo non può essere tradotto in un Espressione del negozio. – Rodney

+0

Sì, hai ragione. Penso che la soluzione a questo è quello di utilizzare 'SqlFunctions' Come @ soluzione MarcinJuraszek: ' var = groupedByWeek salesOrdersList.GroupBy (i => SqlFunctions.DatePart ("settimana", i.DueDate)); ' perché questa funzione può essere tradotto in questo normale codice SQL 'SELECT * Da T GROUP BY DATEPART (wk, T.Date)' – hoss77