我有以下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时似乎有效。
有没有办法使这项工作有效?
答案 0 :(得分:2)
这在使用Entity Framework Core 2.2时似乎有效
是的,这似乎在EF Core 3.0中已被打破。
我个人不喜欢使用DefaultIfEmpty
来避免LINQ聚合方法Average
,Min
和Max
引起的“序列没有元素” 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