我有以下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时,这似乎可行。
有没有办法使这项工作?
这在使用Entity Framework Core 2.2时似乎有效
没错,这似乎在EF Core 3.0中已被打破。
我个人从来不喜欢的使用DefaultIfEmpty
,以避免“的顺序没有任何元素” LINQ到对象的异常与LINQ合计方法Average
,Min
和Max
。相反,我更喜欢使用强制转换来促进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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句