Линк группировка по Максу не работает - PullRequest
1 голос
/ 22 декабря 2011

У меня есть таблица с продуктами

Id  |  Name      |  Order
1   | product 1  |    5
1   | product 1  |    9
1   | product 1  |    2 
2   | product 2  |    0
3   | product 3  |    1

Мне нужно вернуть только продукт с максимальным номером заказа:

Id  |  Name      |  Order

1   | product 1  |    9
2   | product 2  |    0 
3   | product 3  |    1

попробовал это, но это не работает:

var items = (from i in db.products
                 group i by new
                 {
                     i.Id,
                     i.Name,
                     i.Order
                 } into g

                 select new
                 {
                     g.Key.Id,
                     g.Key.Name,
                     Order = g.Where(d => d.Order == g.Max(xx => xx.Order )).First().Order     })

но все равно возвращает все 5 результатов. спасибо

Ответы [ 2 ]

3 голосов
/ 22 декабря 2011

Измените

             group i by new
             {
                 i.Id,
                 i.Name,
                 i.Order
             } into g

на

             group i by new
             {
                 i.Id,
                 i.Name,
             } into g

Я думаю, я бы также переписал последнее выражение на

Order = g.OrderByDescending(xx => xx.Order).First().Order

В основном потому, что я думаю, что это прощечитать, но сгенерированный SQL тоже может быть более эффективным.Но это всего лишь вопрос вкуса, и любую разницу в производительности можно проверить с помощью SQL Profiler.

0 голосов
/ 22 декабря 2011

Причина, по которой у вас осталось 5 рядов, заключается в том, что порядок для вашей группы отличается по комбинации.Это будет запрос, если вы хотите использовать оригинальный или использовать порядок, чтобы получить максимальный заказ.

var items = (from i in db.products
                 group i by new
                 {
                     i.Id,
                     i.Name                     
                 } into g

                 select new
                 {
                     g.Key.Id,
                     g.Key.Name,
                     Order = g.Where(d => d.Order == g.Max(xx => xx.Order )).First().Order     })
...