LINQ Max扩展方法在空集合上给出错误

Nat*_*Pet 21 c# linq

我有以下查询:

var maxNumber = dbContext.Where(a => a.Id == 9).Max(a => a.Sample_Num);
Run Code Online (Sandbox Code Playgroud)

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

我试过了:

var maxNumber = dbContext.Where(a => a.Id == 9).Max(a => a.Sample_Num) ?? 0; 
Run Code Online (Sandbox Code Playgroud)

以及其他变化,但无法使其工作

Tim*_*ter 75

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

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

或者您可以使用DefaultIfEmpty(defaultValue):

int maxNumber = dbContext
    .Where(a => a.Id == 9)
    .Select(a => a.Sample_Num)
    .DefaultIfEmpty(0)
    .Max();
Run Code Online (Sandbox Code Playgroud)

  • 同意.我讨厌使用`Any()`,因为它第二次强制枚举. (4认同)
  • Select + DefaultIfEmpty + Max是您需要MaxOrDefault时的方法。 (2认同)
  • 请注意,对于“IQueryable<T>”和某些提供程序(*咳嗽* NHibernate),“DefaultIfEmpty”未实现。我编写了自己的 MaxOrDefault:`query.OrderByDescending(expression).Select(expression).FirstOrDefault();` (2认同)

小智 6

只需使用 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?>。然后您可以在 ?? 之后指定所需的默认值。