我知道我可以使用.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,如果您知道更好的方法。
答案 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
)。