2008-10-01 5 views

Antwort

76
 using (DataContext dc = new DataContext()) 
     { 
      var q = from t in dc.TableTests 
        group t by t.SerialNumber 
         into g 
         select new 
         { 
          SerialNumber = g.Key, 
          uid = (from t2 in g select t2.uid).Max() 
         }; 
     } 
+1

Ich möchte beide als Antworten akzeptieren, aber ich denke, ich kann nicht, also habe ich für euch beide gewählt. Vielen Dank!!! –

58
var q = from s in db.Serials 
     group s by s.Serial_Number into g 
     select new {Serial_Number = g.Key, MaxUid = g.Max(s => s.uid) } 
+0

Ich möchte beide als Antworten akzeptieren, aber ich denke, ich kann nicht, also habe ich für euch beide gewählt. Dank ein BUNCH !!! –

+0

Beachten Sie auch, dass die Variable für den Ausdruck => Lambda in der Funktion Max beliebig sein kann (s => s.uid, tv => tv.uid, asdf => asdf.uid). Linq erkennt es automatisch als Auswahl über Elemente des Typs Seriell. – Michael

21

Ich habe DamienG Antwort in LinqPad geprüft. Statt

g.Group.Max(s => s.uid) 

sollte

sein
g.Max(s => s.uid) 

Thank you!

+1

upvoted für den zusätzlichen Aufwand bei der Überprüfung dieser – Michael

+7

Dies sollte wahrscheinlich einen Kommentar zu DamienG's Antwort. –

11

In Methoden Kettenform:

db.Serials.GroupBy(i => i.Serial_Number).Select(g => new 
    { 
     Serial_Number = g.Key, 
     uid = g.Max(row => row.uid) 
    }); 
5

Die Antworten sind in Ordnung, wenn Sie nur die zwei Felder benötigen, aber für eine komplexere Aufgabe, vielleicht könnte dieser Ansatz nützlich sein:

from x in db.Serials 
group x by x.Serial_Number into g 
orderby g.Key 
select g.OrderByDescending(z => z.uid) 
.FirstOrDefault() 

. .. das wird die "Select new" vermeiden

+0

Ich mag das - wissen Sie, ob es so effizient ist wie die anderen Antworten? – noelicus

+0

Sie haben die Abfragesyntax hier bis zum Ende verwendet, wo Sie zur Methoden-Syntax gewechselt haben. Musstest Du? Ist das vollständige Abfragesyntaxformular für Ihre Lösung? – Seth