C# LINQ中使用聚合函数报错 System.InvalidOperationException Sequence contains no elements

问题:

在一个linq查询中使用了平均值聚合函数Average,结果报错 System.InvalidOperationException Sequence contains no elements (序列不包含任何元素)
也就是说,使用某些linq的函数时,如果值不存在是会报错的,比如:

First()
Single()
FirstAsync()
SingleAsync()
Last()
LastAsync()
Max()
Min()
Average()

等,

解决方案:

使用空判断的方法:
比如不确定是否有值的情况不使用First()和Single(),而是使用FirstOrDefault()和SingleOrDefault()
如Average()可以在之前加 DefaultIfEmpty() [返回指定序列中的元素;如果序列为空,则返回单一实例集合中的类型参数的默认值。]

var list=ctx.Persons.where(p=>p.Id==1).select( => new{ p.Age });
var avg=list.DefaultIfEmpty().Average(p=>(decimal)p.Age); //如果小数点的话转换成decimal,计算才准确

如果以上还是抛出错误(可能是Object reference not set to an instance of an object,对象引用未实例化),
可以使用如下方式:

var list=ctx.Persons.where(p=>p.Id==1).select( => (decimal) p.Age  );//不使用new 直接查询需要的字段
var avg=list.DefaultIfEmpty().Average(); 
posted @ 2023-08-02 14:52  清和时光  阅读(1299)  评论(0编辑  收藏  举报