2010-11-15 6 views
17

Ich versuche, eine Linq-Gruppe nur durch den Datum Teil eines Datetime-Felds zu tun.LINQ to Entities group-by failure mit .date

Diese Linq-Anweisung funktioniert, aber es gruppiert nach Datum und Uhrzeit.

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

Wenn ich diese Aussage zu einer Gruppe ausführen, indem nur das Datum bekomme ich folgende Fehler

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

Der angegebene Typ Mitglied ‚Date‘ ist nicht auf Entitäten in LINQ unterstützt. Nur Initializers, Entitätsmitglieder und Entitätsnavigationseigenschaften werden unterstützt.

Wie kann ich eine Gruppe nach Datum und nicht nach Datum und Uhrzeit sortieren?

+0

Das ist seltsam, weil Derselbe genaue Code funktioniert für Linq to SQL! – azamsharp

Antwort

32

Verwenden Sie die EntityFunctions.TruncateTime Methode:

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

Dies funktioniert. Es ist ein wenig sauberer als die andere Lösung, die auch funktioniert. Vielen Dank! – twamn

+0

Es funktioniert in allen Fällen außer wenn verschiedene Zeitzonen verwendet werden. Dann erfolgt die Gruppierung auch in Zeitzonen. Ich habe hier eine schlechte Lösung gepostet und möchte etwas helfen, um den Code sauberer zu machen: [.NET LINQ zu Entitäten gruppieren nach Datum (Tag)] (http://stackoverflow.com/questions/11016703/net-linq-to-entities -group-by-date-day) – Zeezer

+0

Danke. Ich habe tagelang danach gesucht. Du bist der Mann – Dudipoli

0

Sie können DateTime.Date nicht in einer Linq-to-Entities-Abfrage verwenden. Entweder gruppieren Sie die Felder explizit oder erstellen ein Feld Date in der Datenbank. (Ich hatte das gleiche Problem - ich habe ein Date Feld in der db verwendet, nie zurück geschaut).

5

Mögliche Lösung here, die das Muster folgt:

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; 

Also, für Ihre Anfrage [ungetestet]:

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

Dies funktioniert mit einem kleinen Mod. "in g" muss am Ende der dritten Zeile hinzugefügt werden. Vielen Dank! – twamn

+0

Aber ich würde sagen, adrift Lösung ist die bessere, wenn Sie EF 4.0 verwenden .. Ich war zuvor nicht bewusst, die EntityFunctions utils .. –