从可能不返回任何行的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)。请注意,我不想依赖子行的原始计数,以防旧版应用程序在计数器值中引入空白(可能)。我很想使这个问题过于笼统。
最佳答案
由于DefaultIfEmpty
未在LINQ to SQL中实现,因此我对其返回的错误进行了搜索,并找到了一个fascinating article,它处理聚合函数中的空集。总结一下我发现的内容,可以通过在选择的范围内强制转换为nullable来解决此限制。我的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();
关于c# - 最高还是默认?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/341264/