使用平均值 returns "The sequence has no elements"

Using Average returns "The sequence has no elements"

我有以下 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 class 是:

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

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

有没有办法让它工作?

This seemed to work when using Entity Framework Core 2.2

你是对的,这似乎在 EF Core 3.0 中被打破了。

我个人从来不喜欢使用 DefaultIfEmpty 来避免 "The sequence has no elements" 使用 LINQ 聚合方法 AverageMinMax 的 LINQ to Objects 异常。相反,我更喜欢在这种情况下使用 cast 来提升 return 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