Как мне получить строку MAX с помощью GROUP BY в запросе LINQ?

96

Я ищу способ в LINQ соответствовать следующему запросу SQL.

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

На самом деле ищу помощь по этому поводу. Вышеупомянутый запрос получает максимальный uid каждого серийного номера из-за Group Byсинтаксиса.

SpoiledTechie.com
источник

Ответы:

94
        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
источник
1
Я хочу принять оба варианта как ответы, но, полагаю, не могу, поэтому проголосовал за вас обоих, ребята. Огромное спасибо!!!
SpoiledTechie.com 01
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) }
DamienG
источник
Я хочу принять оба ответа в качестве ответов, но, полагаю, не могу, поэтому я проголосовал за вас обоих, ребята. Огромное спасибо!!!
SpoiledTechie.com 01
Также обратите внимание, что переменная для лямбда-выражения => в функции Max может быть любым (s => s.uid, tv => tv.uid, asdf => asdf.uid). Linq автоматически распознает это как выделение элементов типа Serial.
Michael
31

В форме цепочки методов:

db.Serials.GroupBy(i => i.Serial_Number).Select(g => new
    {
        Serial_Number = g.Key,
        uid = g.Max(row => row.uid)
    });
Lu55
источник
23

Я проверил ответ DamienG в LinqPad. Вместо того

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

должно быть

g.Max(s => s.uid)

Спасибо!

denis_n
источник
10
Вероятно, это следует прокомментировать ответ DamienG.
Cᴏʀʏ 07
11

Ответы нормальные, если вам нужны только эти два поля, но для более сложного объекта, возможно, этот подход может быть полезен:

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

... это позволит избежать "выбрать новый"

Хавьер
источник
Мне это нравится - знаете ли вы, насколько он эффективен, как другие ответы?
noelicus
Здесь вы использовали синтаксис запроса до самого конца, где вы перешли на синтаксис метода. Вам пришлось? Является ли ваше решение полной формой синтаксиса запроса?
Сет,
0

Это можно сделать с помощью GroupBy и SelectMany в выражении LINQ lamda.

var groupByMax = list.GroupBy(x=>x.item1).SelectMany(y=>y.Where(z=>z.item2 == y.Max(i=>i.item2)));
Абхас Бхой
источник