繁体   English   中英

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

[英]Get min value in row during LINQ query

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

但是,我想只获得以下三列的MIN值
DulezitostId,ZpozdeniId,SpolehlivostId作为值:

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

最终结果应如下所示:
结果:2,值:1
结果:3,价值:2

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

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

您可以创建值的数组并对其执行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

如果您使用直接LINQ,最好的解决方案是Chad的答案 但是,如果您使用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 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM