Получить минимальное значение в строке во время запроса LINQ - PullRequest
3 голосов
/ 21 апреля 2011

Я знаю, что могу использовать .Min (), чтобы получить минимальное значение из столбца, но как получить минимальное значение в строке?

У меня следующий запрос LINQ (для тестирования):

from p in Pravidloes
where p.DulezitostId == 3
where p.ZpozdeniId == 1 || p.ZpozdeniId == 2
where p.SpolehlivostId == 2 || p.SpolehlivostId == 3

group p by p.VysledekId into g
select new {
  result = g.Key,
  value = g
}

Что приводит к этому:
linqqueryimage http://i52.tinypic.com/qq92bq.png

Однако я хотел бы получить только значение MIN из следующих трех столбцов:
DulezitostId, ZpozdeniId, SpolehlivostId как значение в:

select new {
  result = g.Key,
  value = g // <-- here
}

Окончательный результат должен выглядеть следующим образом:
результат: 2, значение: 1
результат: 3, значение: 2

Я искал подобные вопросы здесь и нашел несколько примеров с группировкой и агрегацией запросов, но не нашел ничего, что могло бы продвинуть меня вперед в решении этой проблемы.

Кстати: решение не ограничивается linq, если вы знаете лучший способ, как это сделать.

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

Лучшее решение, если вы используете прямой LINQ - это ответ Чада . Однако, если вы используете Linq To SQL, он не будет работать, потому что вы не можете создать такой массив.

К сожалению, я считаю, что единственный способ сделать это в Linq To Sql - это повторно использовать Math.Min:

select new {
  result = g.Key,
  value = Math.Min(Math.Min(DulezitostId, ZpozdeniId), SpolehlivostId)
}

Это сгенерирует некрасивые CASE WHEN ... операторы, но это работает.

Основным преимуществом этого способа является то, что вы возвращаете только те данные, которые вам нужны из SQL (вместо того, чтобы возвращать все 3 столбца и делать Min в приложении).

3 голосов
/ 21 апреля 2011

Вы можете создать массив значений и выполнить Min для них.

select new {
  result = g.Key,
  value = g.SelectMany(x => new int[] { x.DulezitostId, x.ZpozdeniId, x.SpolehlivostId }).Min()
}

Это вернет минимум для этих 3 значений в каждой группе для ВСЕХ строк этой группировки.

Что приведет к чему-то вроде этого ...

результат: 3, значение: 1

Ниже приведен выбор минимума для каждой строки в группе ...

select new {
  result = g.Key,
  value = g.Select(x => new int[] { x.DulezitostId, x.ZpozdeniId, x.SpolehlivostId }.Min())
}

Что приведет к чему-то вроде этого ...

результат: 3, значение: 1, 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...