使用平均值返回“序列中没有元素”

时间:2019-11-17 13:50:16

标签: c# entity-framework-core linq-to-entities entity-framework-core-3.0

我有以下Entity Framework 3.0查询:

var result = await posts
   .Where(x => x.Published.HasValue)
   .DefaultIfEmpty()
   .AverageAsync(x => x.Published.Day);

帖子中没有元素时,我会收到错误消息:

The sequence has no elements

Post类为:

public class Post {
  public Int32 Id { get; set; }
  public DateTime? Published { get; set; }
}

这在使用Entity Framework Core 2.2时似乎有效。

有没有办法使这项工作有效?

1 个答案:

答案 0 :(得分:2)

  

这在使用Entity Framework Core 2.2时似乎有效

是的,这似乎在EF Core 3.0中已被打破。

我个人不喜欢使用DefaultIfEmpty来避免LINQ聚合方法AverageMinMax引起的“序列没有元素” LINQ to Objects异常。相反,我更喜欢使用强制转换来促进可为空的重载,这种重载在这种情况下会返回null,而不是抛出异常。这也是这些聚合方法的自然SQL行为,因此几乎总是正确转换,包括EF Core 3.0。

将其应用于相关查询:

var result = await posts
   .Where(x => x.Published.HasValue)
   .AverageAsync(x => (int?)x.Published.Value.Day);

请注意,结果的类型现在可以为空,因此,如果需要将其转换为某个幻数,例如,请使用??运算符。

return result ?? 0