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.

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()
                        };
        }

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) }

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)
    });

22

Saya telah memeriksa jawaban DamienG di LinqPad. Dari pada

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

seharusnya

g.Max(s => s.uid)

Terima kasih!


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"


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)));
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.