Entity framework core 枚举为空时,AverageAsync引发异常

Entity framework core 枚举为空时,AverageAsync引发异常,entity-framework-core,linq-to-entities,Entity Framework Core,Linq To Entities,使用实体框架核心,我有以下查询: var avgDuration = await projects.AverageAsync(x => x.Duration); 当枚举projects为空时,我得到以下错误: InvalidOperationException: Sequence contains no elements. 是否有一种方法可以AverageAsync在枚举为非元素时不引发异常 不应该只返回null 是否有一种方法可以AverageAsync在枚举为非元素时不引发异常

使用实体框架核心,我有以下查询:

var avgDuration = await projects.AverageAsync(x => x.Duration);
当枚举
projects
为空时,我得到以下错误:

InvalidOperationException: Sequence contains no elements. 
是否有一种方法可以
AverageAsync
在枚举为非元素时不引发异常

不应该只返回null

是否有一种方法可以
AverageAsync
在枚举为非元素时不引发异常

不应该只返回null

当值类型为空时,
Average
AverageAsync
(以及
Min
Max
)将在空集上返回
null
。如果不是,只需使用C#cast操作符将其升级为相应的可为null的类型

例如,如果您的示例中
x.Duration
的类型为
int
,则使用
int?
cast:

var avgDuration = await projects.AverageAsync(x => (int?)x.Duration);

如果您想在源集为空时得到0(零),那么只需应用
??结果是0

我找到了解决方法。。。使用DefaultIfEmpty:

var avgDuration = await projects.DefaultIfEmpty().AverageAsync(x => x.Duration);

使用DefaultIfEmpty不是更好吗?这不是它的目的吗?不确定。。。我试过了,但至少成功了。@MiguelMoura当
x
null
(默认值)时,
x.Duration
表达式如何
DefaultIfEmpty
主要用于实现左外联接,因为缺少特殊的LINQ运算符。在这种情况下,持续时间从不为null。。。问题是当项目枚举为空时。您的问题中有什么遗漏吗?@MiguelMoura当您使用
DefaultIfEmpty
时,当原始集合为空时,变量
x
将为
null
。因此
x.Duration
将由于访问
null
成员而产生异常。