Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LINQ查询期间获取行中的最小值_C#_Sql_Linq_Lambda - Fatal编程技术网

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

C# 在LINQ查询期间获取行中的最小值,c#,sql,linq,lambda,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 { resul

我知道我可以使用.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
}
其结果是:

但是,我只想得到以下三列的最小值: DulezitostId、ZPOZDENID、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,最佳解决方案是。但是,如果您使用LINQtoSQL,它将无法工作,因为您无法构建这样的数组

不幸的是,我认为在Linq to Sql中实现这一点的唯一方法是反复使用Math.Min:

select new {
  result = g.Key,
  value = Math.Min(Math.Min(DulezitostId, ZpozdeniId), SpolehlivostId)
}
这将产生一些丑陋的情况时。。。声明,但它是有效的


这样做的主要优点是,您只从SQL返回所需的数据,而不是返回所有3列并在应用程序中执行Min。

谢谢!我试图这样做,但不知道正确的语法。无论如何我遇到了这个错误:构造的数组只支持包含。@Dampe:LINQ to SQL不知道如何将该查询转换为SQL。在此选择之前,在零件上调用AsEnumerable,然后您可以在内存中对结果执行此选择。@Dampe请参阅我的答案-如果您使用Linq To Sql,则可以使用Math.Min而不是使用Linq To Sql更正,您可以强制执行查询。ToArray、.ToList,然后执行此操作,或者使用Math.MinMath.Minx1、x2、x3确定,这就完成了任务。我想我应该提到我正在使用实体框架上下文,即LINQ to Entities?。再次感谢。我和它斗争了至少一个小时:这里没有多少捷克人,很高兴看到另一个。嗨。。是的,的确如此。顺便说一句:谢谢你的帮助+1、谢谢你的意见。这也是一个有价值的答案,但我已决定对我的案例使用第一种解决方案。不幸的是,不能同时标记这两个答案:@Dampe另一个答案是更好的代码,但请注意,如果您选择了很多行,那么在内存中执行MIN而不是SQL需要从数据库跨网络提取3倍的数据。现在,我正好得到4行。将来,我不会用超过10来计算,所以我想应该没问题。@Dampe啊,是的,那么这对你来说就不重要了: