2013-04-12 13 views
6

Ich bin mit ASP.NET v4.5 und Linq zu Entitäten ich meine Daten von Woche zu einer Gruppe versuchen den Code unten mitLinq to Entities Gruppe von Woche Anzahl

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

jedoch ein Ich erhalte " gelb Bildschirm des Todes“mit dem Fehler:

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

Idealerweise würde ich setzen möchte

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

Aber das Leben ist nicht so einfach!

Kennt jemand eine Möglichkeit, Wochenzahlen mit Linq zu Entities zu verwenden?

+0

Was ist das Problem mit ihm? –

+0

LINQ to Entities erkennt die Methode 'System.DateTime AddDays (Double)' nicht und diese Methode kann nicht in einen Speicherausdruck übersetzt werden. –

+0

Was passiert, wenn Sie es in 'i => i.DueDate - TimeSpan.FromDays (i.DueDate.DayOfWeek)' oder 'i => i.DueDate - new TimeSpan (i.DueDate.DayOfWeek, 0, 0, 0) '? –

Antwort

14

Verwenden SqlFunctions.DatePart() Methode:

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

Es wird DATEPART SQL-Funktionsaufruf in den generierten SQL-Abfrage hinzuzufügen.

0

Oder Sie können das Datum des ersten Tages in der Woche erhalten, gruppieren Sie dann bis zu diesem Datum.

Um das Datum des ersten Tages in der Woche zu erhalten. können Sie diesen Code verwenden:

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; 
    } 
} 

dann können Sie Gruppe durch den ersten Tag der Woche wie folgt aus:

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

Hmm Ich mag diese Lösung, aber ich bekomme dies err: r System.NotSupportedException: LINQ to Entities erkennt die Methode 'System.DateTime StartOfWeek (System.DateTime, System.DayOfWeek)' 'Methode, und diese Methode kann nicht in eine übersetzt werden Ausdruck speichern. – Rodney

+0

Ja, Sie haben Recht. ich glaube, die Lösung dafür ist, durch 'SqlFunctions' mit Wie @ MarcinJuraszek Lösung: ' var groupedByWeek = salesOrdersList.GroupBy (i => SqlFunctions.DatePart ("Woche", i.DueDate)); ' da diese Funktion kann in diesen regulären SQL-Code übersetzt werden 'SELECT * Von T GROUP BY DATEPART (wk, T.Date)' – hoss77