首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Max还是Default?

Max还是Default?
EN

Stack Overflow用户
提问于 2008-12-04 16:45:04
回答 13查看 111.2K关注 0票数 194

从可能不返回任何行的LINQ查询中获取最大值的最佳方法是什么?如果我只是这样做

代码语言:javascript
复制
Dim x = (From y In context.MyTable _
         Where y.MyField = value _
         Select y.MyCounter).Max

当查询没有返回任何行时,我会得到一个错误。我能做到

代码语言:javascript
复制
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)。请注意,我不想依赖于子行的原始计数,以防遗留应用程序在计数器值中引入间隙(可能)。我的错误是试图把问题搞得太笼统了。

EN

回答 13

Stack Overflow用户

发布于 2010-04-07 22:05:32

我刚刚遇到了一个类似的问题,但我在列表上使用的是LINQ扩展方法,而不是查询语法。转换为Nullable技巧也适用于此:

代码语言:javascript
复制
int max = list.Max(i => (int?)i.MyCounter) ?? 0;
票数 122
EN

Stack Overflow用户

发布于 2008-12-04 18:04:14

听起来像是DefaultIfEmpty的案例(未经测试的代码如下):

代码语言:javascript
复制
Dim x = (From y In context.MyTable _
         Where y.MyField = value _
         Select y.MyCounter).DefaultIfEmpty.Max
票数 49
EN

Stack Overflow用户

发布于 2008-12-04 16:56:20

您始终可以将Double.MinValue添加到序列中。这将确保至少有一个元素,并且只有当它实际上是最小元素时,Max才会返回它。要确定哪个选项更有效(ConcatFirstOrDefaultTake(1)),您应该执行充分的基准测试。

代码语言:javascript
复制
double x = context.MyTable
    .Where(y => y.MyField == value)
    .Select(y => y.MyCounter)
    .Concat(new double[]{Double.MinValue})
    .Max();
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/341264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档