从可能不返回任何行的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

但对于这样一个简单的请求,这感觉有点迟钝.我错过了更好的方法吗?

更新:以下是背景故事:我正在try 从子表中检索下一个资格计数器(遗留系统,不要让我开始…).每个患者的第一个合格行始终为1,第二个为2,以此类推(显然这不是子表的主键).因此,我为患者 Select 最大现有计数器值,然后向其添加1以创建新行.当没有现有的子值时,我需要查询返回0(因此添加1将给我一个计数器值1).请注意,我不想依赖子行的原始计数,以防遗留应用程序在计数器值中引入间隙(可能).我的缺点是试图让问题过于笼统.

推荐答案

由于DefaultIfEmpty没有在LINQ to SQL中实现,所以我对它返回的错误进行了搜索,找到了一个处理聚合函数中空集的fascinating article.总结一下我的发现,你可以通过在你的select中使用null来绕过这个限制.我的VB有点Rust 了,但我想它应该是这样的:

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();

.net相关问答推荐

Docker镜像mcr.microsoft.com/dotnet/aspnet:8.0不能在Windows上构建

从窗体中移除另一个控件中引用的控件时获取设计时通知

如何在 C# 中自动删除临时文件?

为什么 SortedSet.GetViewBetween 不是 O(log N)?

整个命名空间的SuppressMessage

如何让 DateTimePicker 显示一个空字符串?

我应该从 .NET 中的 Exception 或 ApplicationException 派生自定义异常吗?

从 Web.Config 中的邮箱友好显示名称存储 Smtp

为什么 WCF 中不允许方法重载?

Convert.ToBoolean 和 Boolean.Parse 不接受 0 和 1

互锁且易变

是否有可用的 WPF 备忘单?

场与财产.性能优化

.NET 高级别的 .NET 4.0 和 .NET 4.5 的区别

使用+运算符的字符串连接

错误 NU1605 检测到包降级

IronPython 与 Python .NET

当它被抛出和捕获时,不要在那个异常处停止调试器

多个列表与 IEnumerable.Intersect() 的交集

如何为 Dapper 查询动态创建参数