24

我有以下查询:

var maxNumber = dbContext.Where(a => a.Id == 9).Max(a => a.Sample_Num);

如果没有 9 的 Id,我会收到错误消息。如果没有 9 的 Id,我喜欢将结果默认为 0。

我试过了:

var maxNumber = dbContext.Where(a => a.Id == 9).Max(a => a.Sample_Num) ?? 0; 

以及其他变体,但无法使其正常工作

4

3 回答 3

88

您可以Any用来检查是否有匹配的元素:

int maxNumber = 0;
var id9 = dbContext.Where(a => a.Id == 9);
if(id9.Any())
{
    maxNumber = id9.Max(a => a.Sample_Num);
}

或者你可以使用DefaultIfEmpty(defaultValue)

int maxNumber = dbContext
    .Where(a => a.Id == 9)
    .Select(a => a.Sample_Num)
    .DefaultIfEmpty(0)
    .Max();
于 2012-09-13T21:01:19.747 回答
7

只需使用 Max 的可为空版本(即使聚合的值不可为空): var maxNumber = dbContext.Where(a => a.Id == 9).Max(a => (int?)a.Sample_Num) ?? 0;

Nate几乎就是这么做的。关键是 Max of nullables 作为结果从空集合中给出 null,而 Max of ints 给出异常,因为它的返回值是集合的现有 int。您通过显式声明该类型的结果来强制它为 Max<int?>。然后你可以在??之后指定所需的默认值。

于 2020-09-03T15:38:31.753 回答
2

您可以尝试 MaxOrDefault 的简单实现,而无需进行任何转换。只需检查 Max 函数中的选择器参数:

var maxNumber = dbContext.Where(a => a.Id == 9).Max(a => a?.Sample_Num) ?? 0;
于 2021-05-05T16:19:52.083 回答