ToList()、Any()、Count()、Sum() 上的 Linq 错误
Posted
技术标签:
【中文标题】ToList()、Any()、Count()、Sum() 上的 Linq 错误【英文标题】:Linq Errors on ToList(), Any(), Count(), Sum() 【发布时间】:2019-07-27 23:44:24 【问题描述】:我收到以下错误,它们都与 system.linq 有关。奇怪的是该方法有时似乎有效,错误并没有持续发生。
Count() 代码:
using (var dbContext = new Entities(GlobalStuff.EntityConnection))
heartBeat.NumSlipsInSecurityUploadQueue = dbContext.SecurityUploadQueues.Count();
heartBeat.NumSlipsInDataStreamQueue = dbContext.DataStreamQueues.Count();
SecurityUploadQueues 属性:
Public ReadOnly Property SecurityUploadQueues() As ObjectSet(Of SecurityUploadQueue)
Get
If (_SecurityUploadQueues Is Nothing) Then
_SecurityUploadQueues = MyBase.CreateObjectSet(Of SecurityUploadQueue)("SecurityUploadQueues")
End If
Return _SecurityUploadQueues
End Get
End Property
Private _SecurityUploadQueues As ObjectSet(Of SecurityUploadQueue)
SecurityUploadQueue 属性是一个实体对象
Count() 错误:
上传 HeartBeat System.InvalidOperationException 时出错:序列包含多个元素 在 System.Linq.Enumerable.Single[TSource](IEnumerable
1 source) at System.Data.Objects.ELinq.ObjectQueryProvider.<>c__11
1.b__11_3(IEnumerable1 sequence) at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable
1 查询,表达式 queryRoot) 在 System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](表达式表达式) 在 System.Linq.Queryable.Count[TSource](IQueryable`1 源) 在 SettlerService.SettlerService.UploadHeartBeat()
Any() 代码:
var dataToUpload = (from bet in dbContext.DataStreamQueues select bet).Take(200);
if (dataToUpload.Any())
Any() 错误:
System.InvalidOperationException:从一个指定的转换 将 'System.Int32' 类型具体化为 'System.Boolean' 类型不是 有效的。在 System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader
1.GetValue(DbDataReader reader, Int32 ordinal) at lambda_method(Closure , Shaper ) at System.Data.Common.Internal.Materialization.Coordinator
1.ReadNextElement(Shaper 整形器)在 System.Data.Common.Internal.Materialization.Shaper1.SimpleEnumerator.MoveNext() at System.Linq.Enumerable.Single[TSource](IEnumerable
1 来源)在 System.Data.Objects.ELinq.ObjectQueryProvider.c__111.<GetElementFunction>b__11_3(IEnumerable
1 序列)在 System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable1 query, Expression queryRoot) at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.Any[TSource](IQueryable
1 源) 在 SettlerService.SettlerService.UploadDataStream()
我已经进行了一些谷歌搜索,但在这个问题上找不到太多信息。我认为这可能与 system.core 库的版本(system.linq 是其中的一部分)有关,但看不到问题。我正在使用.Net 4.7.2
【问题讨论】:
您似乎在使用实体框架。听起来您有一些 EF 映射需要查看。 你是对的,我们使用的是Entity Framework 5。什么映射会导致错误?dbContext.SecurityUploadQueues
是如何定义的?
所以dbcontext是在数据库第一个edmx文件中定义的,SecurityUploadQueues是数据库中的一个表
从错误来看,SecurityUploadQueues
属性似乎是一个IQueryable
,它已经包含一个Expression
,它可能不直接指向DbSet<>
。但是如果不显示代码就很难判断
【参考方案1】:
second 错误意味着您的DataStreamQueues
数据库表中有一个类型为Int32
的列,但DataStreamQueues
实体中等效属性的类型是bool;所以检查所有列和属性类型是否匹配。
关于first异常,有点奇怪!因为此异常表明您在代码中的某处调用了具有多个项目的集合上的 Single() 方法,并且由于 Single()
只需要一个项目,它会引发异常,但是我没有看到对 Single()
的任何调用在提供的代码中。
【讨论】:
以上是关于ToList()、Any()、Count()、Sum() 上的 Linq 错误的主要内容,如果未能解决你的问题,请参考以下文章
java8 stream collect (收集)toList toSet toHashSet count sum avg max min
C# 中的 .Any 和 .Count 更有效的是啥(扩展方法)[重复]
我应该使用 Any() 还是 Count() ?哪个更快?如果 IEnumerable 对象中存在任何数据,两者都会返回相同的输出(真或假)吗? [复制]