2010-05-03 14 views
7

ich eine einfache Linq zu Enities Tabelle haben abzufragen und die neuesten Datensätze erhalten Datumsfeld mitWählen letzten Aufzeichnungen LINQ to Entities mit

Also habe ich versucht, diesen Code:

IQueryable<Alert> alerts = GetAlerts(); 
IQueryable<Alert> latestAlerts = 
    from a in alerts 
    group a by a.UpdateDateTime into g 
    select g.OrderBy(a => a.Identifier).First(); 

Error: NotSupportedException: The method 'GroupBy' is not supported.

Gibt es einen anderen Weg, um es zu tun? Vielen Dank!

+0

Die Gruppierung nach DateTime ist nicht sinnvoll. Wenn die Auflösung beispielsweise Millisekunden beträgt, ist es unwahrscheinlich, dass Sie eine Gruppe mit mehr als einem Element haben. Oder ist das wirklich ein Datumsfeld? –

Antwort

0

die Antwort ist also:

var query = 
    from alert in m_alerts 
    group alert by alert.Identifier 
      into g 
      select new 
      { 
     GroupIdentifier = g.Key, 
     UpdateDateTime = g.Max(p => p.UpdateDateTime) 
      }; 

Dies wird die neuesten Datensätze zurückgeben.

+0

Dies wird ein neues Objekt zurückgeben {Key, Date} Gibt es eine Möglichkeit, die gleichen "Alarm" -Objekte zurück zu geben? – Begemotya

+0

Ich bin hier auf Ihren Kommentar stecken. In meinen Tests I ' Ich bekomme auch {Key, Date}, aber Sie haben dies als gelöst markiert. Wie bekommen Sie die Alarmobjekte? – Jacques

4

Wenn es keinen Grund zu der Gruppe ist es, die Sie gerade Ihre Abfrage wechseln könnte ein wenig nach oben:

IQueryable<Alert> alerts = GetAlerts(); 
IQueryable latestAlerts = alerts.OrderByDescending(a => a.UpdateDateTime); 
+3

Dies wird die gesamte Datenbank in den Speicher geladen, wenn sie abgefragt wird ... –

+0

@BlueRaja - eigentlich wird es nichts tun. Bis Sie etwas mit nextAlerts wie .First() oder .Take (10) tun, wird kein Datenbanktreffer auftreten. –

+2

@hightechrider: Daher das "wenn gefragt" ... Vermutlich suchte das Plakat nach einer vollständigen Antwort. –

0

Es sollte

sein
IQueryable<Alert> latestAlerts = 
    (from a in alerts 
    group a by a.UpdateDateTime into g 
    order by g.Key 
    select g).First(); 

GroupBy wird auf jeden Fall unterstützt von Linq-to -Entities

+0

es funktioniert nicht, die "Reihenfolge von g.key" ist "rot" -> "ein Abfragetext muss mit Select-Klausel oder einer Gruppenklausel – Begemotya

+0

enden Jede Art, die ich durch 2 Felder" UpdateDateTime "und" Id "in Um den neuesten Datensatz für jede ID zu erhalten – Begemotya

8

Ich hatte einen ähnlichen Bedarf. Ich möchte den getippten Datensatz zurückholen, nicht ein neues anonymes Objekt. Um das zu tun.First() kann helfen.

var query = from alert in m_alerts 
     group alert by alert.Identifier into a 
     select a.OrderByDescending(g => g.UpdateDateTime).First(); 

Verwenden Sie das OrderByDescending, um sie zu ordnen, und nehmen Sie das oberste mit First(). Sie haben sie nach Ihrem Bezeichner gruppiert, sodass Sie nur den neuesten Datensatz für jeden Bezeichner erhalten.

+1

Hatte FirstOrDefault() zu verwenden, aber hat gut damit gearbeitet. – Joshua