2009-01-22 7 views
90

Ich habe eine Tabelle, 'letzte Spuren', mit den folgenden Feldern.So wählen Sie nur die Datensätze mit dem höchsten Datum in LINQ

Id, AccountId, Version, DownloadNo, Date 

Die Daten sieht wie folgt aus:

28092|15240000|1.0.7.1782|2009040004731|2009-01-20 13:10:22.000 
28094|61615000|1.0.7.1782|2009040007696|2009-01-20 13:11:38.000 
28095|95317000|1.0.7.1782|2009040007695|2009-01-20 13:10:18.000 
28101|15240000|1.0.7.1782|2009040004740|2009-01-20 14:10:22.000 
28103|61615000|1.0.7.1782|2009040007690|2009-01-20 14:11:38.000 
28104|95317000|1.0.7.1782|2009040007710|2009-01-20 14:10:18.000 

Wie kann ich, in LINQ to SQL, erhalten nur die letzte lasttrace jeder AccountId (die mit dem höchsten Datum)?

+0

eigentlich in Ihrem Beispiel alle Protokolle mit der gleichen Konto-ID, haben genau das gleiche Datum, also was man in diesem Fall bevorzugt? – BlackTigerX

Antwort

188

Wenn Sie nur das letzte Datum für jedes Konto wollen, sollten Sie diese verwenden:

var q = from n in table 
     group n by n.AccountId into g 
     select new {AccountId = g.Key, Date = g.Max(t=>t.Date)}; 

Wenn Sie den gesamten Datensatz:

var q = from n in table 
     group n by n.AccountId into g 
     select g.OrderByDescending(t=>t.Date).FirstOrDefault(); 
+0

hhaa. Du warst schneller;) –

+2

Oracle unterstützt das nicht. Wenn die Abfrageleistung nicht berücksichtigt wird, können Sie die Tabelle ToList vor der Abfrage konvertieren. –

+4

Es wäre großartig, wenn Sie dafür eine 'method-chain'-Lösung posten könnten. – Lijo

4

Es könnte etwas wie:

var qry = from t in db.Lasttraces 
      group t by t.AccountId into g 
      orderby t.Date 
      select new { g.AccountId, Date = g.Max(e => e.Date) }; 
3

zum einen einfachen Weg, dies zu tun: -

Folgende Informationen 210

eine Klasse Erstellt

  • Stufe (Anzahl)
  • URL (URL der Website)

Gehen Sie die Liste der Websites auf einem Arraylist-Objekt gespeichert zu halten. Und führte folgende Abfrage aus, um sie in absteigender Reihenfolge nach Level zu sortieren.

var query = from MyClass object in objCollection 
    orderby object.Level descending 
    select object 

Sobald ich die Sammlung bekam in absteigender Reihenfolge sortiert, schrieb ich folgenden Code, um das Objekt zu erhalten, die

MyClass topObject = query.FirstRow<MyClass>() 

Dieser wie Charme arbeitete als obere Reihe kommt.

+0

Das gab mir eine bessere Idee als mein ursprünglicher Gedanke. Vielen Dank! – Paulj

31

Dies ist ein einfacher Weg, es ist einen Blick diesen großen LINQ Platz haben

var lastPlayerControlCommand = this.ObjectContext.PlayerControlCommands 
           .Where(c => c.PlayerID == player.ID) 
           .OrderByDescending(t=>t.CreationTime) 
           .FirstOrDefault(); 

auch zu tun - LINQ to SQL Samples

+1

+1 für nette Lösung. – Sheridan

+12

Diese Lösung funktioniert gut, wenn Sie pro Konto abfragen, aber nicht das tun, was OP angegeben hat, um das neueste Ergebnis für alle Datensätze zu erhalten, ohne eine AccountId (in Ihrem Fall PlayerId) zu liefern. – Maciej

+0

Diese Lösung inspirierte mich zu bestellen anstatt zu versuchen um das Maximum auszuwählen. +1 –

9

Wenn Sie den gesamten Datensatz wollen, hier ist ein Lambda-Weg:

var q = _context 
      .lasttraces 
      .GroupBy(s => s.AccountId) 
      .Select(s => s.OrderByDescending(x => x.Date).FirstOrDefault()); 
Verwandte Themen