Я использую LINQ для IQueryable, возвращаемого NHibernate, и мне нужно выбрать строку с максимальным значением (ями) в нескольких полях.
Я упростил то, что придерживаюсь. Мне нужно выбрать одну строку из моей таблицы с максимальным значением в одном поле.
var table = new Table { new Row(id: 1, status: 10), new Row(id: 2, status: 20) }
from u in table
group u by 1 into g
where u.Status == g.Max(u => u.Status)
select u
Это неверно, но я не могу придумать правильную форму.
Кстати, на самом деле я пытаюсь достичь примерно следующего:
var clientAddress = this.repository.GetAll()
.GroupBy(a => a)
.SelectMany(
g =>
g.Where(
a =>
a.Reference == clientReference &&
a.Status == ClientStatus.Live &&
a.AddressReference == g.Max(x => x.AddressReference) &&
a.StartDate == g.Max(x => x.StartDate)))
.SingleOrDefault();
Я начал с вышеуказанной лямбды, но я использовал LINQPad, чтобы попытаться выработать синтаксис для выбора Max ().
ОБНОВИТЬ
Удаление GroupBy было ключевым.
var all = this.repository.GetAll();
var address = all
.Where(
a =>
a.Reference == clientReference &&
a.Status == ClientStatus.Live &&
a.StartDate == all.Max(x => x.StartDate) &&
a.AddressReference == all.Max(x => x.AddressReference))
.SingleOrDefault();
Ответы:
Я не понимаю, почему вы здесь группируетесь.
Попробуй это:
Альтернативный подход, который будет повторяться
table
только один раз, будет следующим:Это полезно, если
table
такой объектIEnumerable<T>
отсутствует в памяти или рассчитывается на лету.источник
from u in User_Accounts where u.Status == User_Accounts.Max(y => y.Status) select u
table.First(x => x.Status == table.Max(x => x.Status))
table
.Вы также можете:
источник
Вы можете сгруппировать по статусу и выбрать строку из самой большой группы:
Первый
First()
получает первую группу (набор строк с наибольшим статусом); второйFirst()
получает первую строку в этой группе.Если статус всегда unqiue, вы можете заменить второй
First()
наSingle()
.источник
Обращаясь к первому вопросу, если вам нужно взять несколько строк, сгруппированных по определенным критериям, с другим столбцом с максимальным значением, вы можете сделать что-то вроде этого:
источник
Еще один пример:
Следить:
Равно:
источник
Просто в одной строке:
Обратите внимание, что есть два действия. внутреннее действие предназначено для поиска максимального значения, внешнее действие - для получения желаемого объекта.
источник