Bagaimana cara mendapatkan baris MAX dengan kueri GROUP BY di LINQ?

94

Saya mencari cara di LINQ untuk mencocokkan SQL Query berikut.

Select max(uid) as uid, Serial_Number from Table Group BY Serial_Number

Benar-benar mencari bantuan untuk yang satu ini. Kueri di atas mendapatkan uid maksimum dari setiap Nomor Seri karena Group BySintaksnya.

SpoiledTechie.com
sumber

Jawaban:

92
        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()
                        };
        }
tvanfosson.dll
sumber
1
Saya ingin menerima keduanya sebagai jawaban, tapi saya rasa saya tidak bisa, jadi saya memilih kalian berdua. Terima kasih BUNCH !!!
SpoiledTechie.com
69
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) }
DamienG
sumber
Saya ingin menerima keduanya sebagai jawaban, tapi saya rasa saya tidak bisa, jadi saya memilih kalian berdua. Terima kasih BUNCH !!!
SpoiledTechie.com
Perhatikan juga bahwa variabel untuk ekspresi => lambda dalam fungsi Max bisa berupa apa saja (s => s.uid, tv => tv.uid, asdf => asdf.uid). Linq secara otomatis akan mengenalinya sebagai pemilihan elemen dari tipe Serial.
Michael
30

Dalam bentuk rantai metode:

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

Saya telah memeriksa jawaban DamienG di LinqPad. Dari pada

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

seharusnya

g.Max(s => s.uid)

Terima kasih!

denis_n
sumber
10
Ini mungkin merupakan komentar atas jawaban DamienG.
Cᴏʀʏ
10

Jawabannya OK jika Anda hanya memerlukan dua bidang tersebut, tetapi untuk objek yang lebih kompleks, mungkin pendekatan ini bisa berguna:

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

... ini akan menghindari "pilih baru"

Javier
sumber
Saya suka ini - apakah Anda tahu apakah itu seefisien jawaban lainnya?
noelicus
Anda menggunakan sintaks kueri di sini sampai akhir, di mana Anda beralih ke sintaks metode. Apakah Anda harus melakukannya? Apakah bentuk sintaks kueri lengkap untuk solusi Anda?
Seth
0

Ini dapat dilakukan dengan menggunakan GroupBy dan SelectMany dalam ekspresi lamda LINQ

var groupByMax = list.GroupBy(x=>x.item1).SelectMany(y=>y.Where(z=>z.item2 == y.Max(i=>i.item2)));
Abhas Bhoi
sumber