小编典典

最大还是默认?

all

从可能不返回任何行的 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)。请注意,我不想依赖子行的原始计数,以防旧应用程序在计数器值中引入间隙(可能)。试图使问题过于笼统,这对我不利。


阅读 115

收藏
2022-07-08

共1个答案

小编典典

由于DefaultIfEmpty没有在 LINQ to SQL
中实现,我对它返回的错误进行了搜索,发现了一篇关于聚合函数中的空集的引人入胜的文章。总结一下我的发现,您可以通过在您的选择中强制转换为可空值来解决此限制。我的 VB 有点生疏,但我 认为 它会是这样的:

Dim x = (From y In context.MyTable _
         Where y.MyField = value _
         Select CType(y.MyCounter, Integer?)).Max

或者在 C# 中:

var x = (from y in context.MyTable
         where y.MyField == value
         select (int?)y.MyCounter).Max();
2022-07-08