在LINQ查询期间获取行中的最小值

时间:2011-04-21 17:18:05

标签: c# sql linq lambda

我知道我可以使用.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

我一直在寻找类似的问题,并在Google上搜索了几个关于分组和聚合查询的例子,但没有发现任何会让我前进的问题。

顺便说一句:解决方案不仅限于linq,如果您知道更好的方法。

2 个答案:

答案 0 :(得分:3)

你可以创建一个值数组,然后对它们进行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

答案 1 :(得分:3)

如果您使用直接LINQ,最佳解决方案是Chad's answer。但是,如果您使用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)。