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();