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


96

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

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

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

Ответы:


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

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

Я хочу принять оба ответа в качестве ответов, но, полагаю, не могу, поэтому я проголосовал за вас обоих, ребята. Огромное спасибо!!!
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)
    });

23

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

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

должно быть

g.Max(s => s.uid)

Спасибо!


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)));
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.