2008-10-01 16 views

Odpowiedz

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

Chcę przyjąć obie jako odpowiedzi, ale myślę, że nie mogę, więc głosowałem na was obu. Wielkie dzięki!!! –

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

Chciałbym przyjąć obie odpowiedzi jako odpowiedź, ale myślę, że nie mogę, dlatego głosowałem na was obu. Dzięki BUNCH !!! –

+0

Należy również zauważyć, że zmienna dla wyrażenia => lambda w funkcji Max może być dowolna (s => s.uid, tv => tv.uid, asdf => asdf.uid). Linq automatycznie rozpozna to jako wybór elementów typu Szeregowy. – Michael

21

Sprawdziłem odpowiedź DamienG w LINQPad. Zamiast

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

powinny być

g.Max(s => s.uid) 

Dziękujemy!

+1

przegłosowano dla dodatkowego wysiłku sprawdzenia tego – Michael

+7

To prawdopodobnie powinien być komentarz do odpowiedzi DamienG'a. –

11

w metodach postaci łańcucha:

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

Odpowiedzi są OK, jeśli wymagają tylko te dwa pola, ale dla bardziej złożonego obiektu, może to podejście może być przydatne:

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

. .. uniknie to "wybierz nowy"

+0

Podoba mi się to - czy wiesz, czy jest tak wydajny, jak inne odpowiedzi? – noelicus

+0

Użyłeś składni zapytania tutaj aż do końca, gdzie przełączyłeś się na składnię metody. Czy musiałeś? Czy pełna forma składni zapytań dla twojego rozwiązania? – Seth