我有以下查询:
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;
以及其他变体,但无法使其正常工作
您可以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();
只需使用 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?>。然后你可以在??之后指定所需的默认值。
您可以尝试 MaxOrDefault 的简单实现,而无需进行任何转换。只需检查 Max 函数中的选择器参数:
var maxNumber = dbContext.Where(a => a.Id == 9).Max(a => a?.Sample_Num) ?? 0;