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](IEnumerable1 source) at System.Data.Objects.ELinq.ObjectQueryProvider.<>c__111.b__11_3(IEnumerable1 sequence) at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable1 查询,表达式 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.ErrorHandlingValueReader1.GetValue(DbDataReader reader, Int32 ordinal) at lambda_method(Closure , Shaper ) at System.Data.Common.Internal.Materialization.Coordinator1.ReadNextElement(Shaper 整形器)在 System.Data.Common.Internal.Materialization.Shaper1.SimpleEnumerator.MoveNext() at System.Linq.Enumerable.Single[TSource](IEnumerable1 来源)在 System.Data.Objects.ELinq.ObjectQueryProvider.c__111.&lt;GetElementFunction&gt;b__11_3(IEnumerable1 序列)在 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](IQueryable1 源) 在 SettlerService.SettlerService.UploadDataStream()

我已经进行了一些谷歌搜索,但在这个问题上找不到太多信息。我认为这可能与 system.core 库的版本(system.linq 是其中的一部分)有关,但看不到问题。我正在使用.Net 4.7.2

【问题讨论】:

您似乎在使用实体框架。听起来您有一些 EF 映射需要查看。 你是对的,我们使用的是Entity Framework 5。什么映射会导致错误? dbContext.SecurityUploadQueues 是如何定义的? 所以dbcontext是在数据库第一个edmx文件中定义的,SecurityUploadQueues是数据库中的一个表 从错误来看,SecurityUploadQueues 属性似乎是一个IQueryable,它已经包含一个Expression,它可能不直接指向DbSet&lt;&gt;。但是如果不显示代码就很难判断 【参考方案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

为啥我应该使用 Any 方法而不是 Count? [复制]

Linq 高级查询

C# 中的 .Any 和 .Count 更有效的是啥(扩展方法)[重复]

DataTable扩展:转化实体ToList

我应该使用 Any() 还是 Count() ?哪个更快?如果 IEnumerable 对象中存在任何数据,两者都会返回相同的输出(真或假)吗? [复制]