LINQ sorgusunda bir GROUP BY içeren MAX satırını nasıl alırım?


96

LINQ'da aşağıdaki SQL Sorgusu ile eşleşecek bir yol arıyorum.

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

Gerçekten bu konuda biraz yardım arıyorum. Yukarıdaki sorgu, Group BySözdizimi nedeniyle her Seri Numarasının maksimum kullanıcı kimliğini alır .

Yanıtlar:


95
        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
İkisini de cevap olarak kabul etmek istiyorum, ama sanırım yapamam, bu yüzden ikinize de oy verdim. Çok teşekkürler!!!
SpoiledTechie.com

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

İkisini de cevap olarak kabul etmek istiyorum, ama sanırım yapamam, bu yüzden ikinize de oy verdim. Çok teşekkürler!!!
SpoiledTechie.com

Ayrıca, Max işlevindeki => lambda ifadesinin değişkeninin herhangi bir şey olabileceğini unutmayın (s => s.uid, tv => tv.uid, asdf => asdf.uid). Linq, onu otomatik olarak Seri türündeki öğeleri seçtiğinden tanıyacaktır.
Michael

31

Yöntem zinciri biçiminde:

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

23

DamienG'nin yanıtını LinqPad'de kontrol ettim. Onun yerine

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

olmalı

g.Max(s => s.uid)

Teşekkür ederim!


10
Bu muhtemelen DamienG'nin cevabı üzerine bir yorum yapmalıdır.
Cᴏʀʏ

11

Yalnızca bu iki alana ihtiyaç duyuyorsanız yanıtlar uygundur, ancak daha karmaşık bir nesne için, belki bu yaklaşım yararlı olabilir:

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

... bu, "yeni seç" i engelleyecektir


Bunu beğendim - diğer cevaplar kadar verimli olup olmadığını biliyor musun?
noelicus

Sorgu sözdizimini sonuna kadar burada kullandınız, burada yöntem sözdizimine geçtiniz. Mecbur muydun? Çözümünüz için tam bir sorgu sözdizimi formu mu?
Seth

0

Bu, LINQ lamda ifadesinde GroupBy ve SelectMany kullanılarak yapılabilir.

var groupByMax = list.GroupBy(x=>x.item1).SelectMany(y=>y.Where(z=>z.item2 == y.Max(i=>i.item2)));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.