从可能不返回任何行的LINQ查询中获取最大值的最佳方法是什么?如果我只是这样做
Dim x = (From y In context.MyTable _
Where y.MyField = value _
Select y.MyCounter).Max
当查询没有返回任何行时,我会得到一个错误。我能做到
Dim x = (From y In context.MyTable _
Where y.MyField = value _
Select y.MyCounter _
Order By MyCounter Descending).FirstOrDefault
但对于这样一个简单的请求来说,这感觉有点迟钝。我是不是错过了一个更好的方法呢?
更新:这是背景故事:我正在尝试从一个子表中检索下一个资格计数器(遗留系统,不要让我开始...)。每个患者的第一个资格行始终为1,第二个行为2,依此类推(显然这不是子表的主键)。因此,我选择了一个患者的最大现有计数器值,然后将其加1以创建一个新行。当没有现有的子值时,我需要查询返回0(因此加1将得到计数器值1)。请注意,我不想依赖于子行的原始计数,以防遗留应用程序在计数器值中引入间隙(可能)。我的错误是试图把问题搞得太笼统了。
发布于 2010-04-07 22:05:32
我刚刚遇到了一个类似的问题,但我在列表上使用的是LINQ扩展方法,而不是查询语法。转换为Nullable技巧也适用于此:
int max = list.Max(i => (int?)i.MyCounter) ?? 0;
发布于 2008-12-04 18:04:14
听起来像是DefaultIfEmpty
的案例(未经测试的代码如下):
Dim x = (From y In context.MyTable _
Where y.MyField = value _
Select y.MyCounter).DefaultIfEmpty.Max
发布于 2008-12-04 16:56:20
您始终可以将Double.MinValue
添加到序列中。这将确保至少有一个元素,并且只有当它实际上是最小元素时,Max
才会返回它。要确定哪个选项更有效(Concat
、FirstOrDefault
或Take(1)
),您应该执行充分的基准测试。
double x = context.MyTable
.Where(y => y.MyField == value)
.Select(y => y.MyCounter)
.Concat(new double[]{Double.MinValue})
.Max();
https://stackoverflow.com/questions/341264
复制相似问题