【问题标题】:Get min value in row during LINQ query在 LINQ 查询期间获取行中的最小值
【发布时间】:2011-04-21 17:18:05
【问题描述】:

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

结果如下:

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

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

最后的结果应该是这样的:
结果:2,值:1
结果:3,值:2

我一直在这里寻找类似的问题,并在 Google 上搜索了几个有关分组和聚合查询的示例,但没有发现任何可以推动我解决这个问题的问题。

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

【问题讨论】:

  • 这里的捷克人不多,很高兴看到另一个。
  • 嗨.. 是的,确实。顺便说一句:感谢您的帮助;)

标签: c# sql linq lambda


【解决方案1】:

您可以创建一个值数组并对这些值执行 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

【讨论】:

  • 谢谢!我几乎像这样尝试这样做,但不知道正确的语法。无论如何..我收到此错误:Constructed arrays are only supported for Contains.
  • @Dampe:LINQ to SQL 不知道如何将该查询转换为 SQL。在此选择之前的部分上调用AsEnumerable(),然后您可以对内存中的结果进行此选择。
  • @Dampe 看看我的回答——如果你使用的是 Linq To Sql,你可以改用 Math.Min
  • 使用 LINQ to SQL 更正,您要么必须强制查询 (.ToArray(), .ToList()) 然后执行此操作,要么使用 Math.Min(Math.Min(x1, x2), x3)
  • 好的,完成了。我想我应该提到我正在使用实体框架上下文(即我猜的 LINQ to Entities?)。再次感谢。我至少和它战斗了一个小时:)
【解决方案2】:

如果您使用直接 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)。

【讨论】:

  • +1,感谢您的意见。这也是一个有价值的答案,但我决定为我的案例使用第一个解决方案。 (不幸的是不能同时标记两个答案:))
  • @Dampe 另一个答案是更好的代码,但请注意,如果您选择很多行,则在内存中执行 MIN 而不是 SQL 需要从网络中提取 3 倍的数据数据库。
  • 现在,我正好得到 4 行。以后,我不会超过 10 个,所以我想应该没问题。
  • @Dampe 啊,是的,那么这与你无关 :)
猜你喜欢
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 2022-11-25
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多