Linq在使用ToList()、Any()、Count()和Sum()时出现错误。

3

我遇到了以下错误,它们都与 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属性是一个EntityObject。

Count() 错误:

上传心跳错误 System.InvalidOperationException:序列中包含多个元素
在System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)处 在System.Data.Objects.ELinq.ObjectQueryProvider.<>c__111.b__11_3(IEnumerable`1 sequence)处 在System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)处
在System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression)处
在System.Linq.Queryable.Count[TSource](IQueryable`1 source)处
在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”类型的指定转换无效。 at 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 shaper) at System.Data.Common.Internal.Materialization.Shaper1.SimpleEnumerator.MoveNext() at System.Linq.Enumerable.Single[TSource](IEnumerable1 source) at System.Data.Objects.ELinq.ObjectQueryProvider.<>c__111.<GetElementFunction>b__11_3(IEnumerable1 sequence) at 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 source)
我已经进行了一些谷歌搜索,但没有找到太多关于这个问题的信息。 我认为这可能与system.core库的版本有关(其中包括system.linq),但我并没有发现任何问题。 我正在使用.NET 4.7.2

你似乎在使用Entity Framework。听起来你有一些需要检查的EF映射。 - Dandré
你说得对,我们正在使用Entity Framework 5。是什么映射导致了这些错误? - Spitfire5793
dbContext.SecurityUploadQueues 是如何定义的? - haim770
所以dbcontext是在数据库优先的edmx文件中定义的,SecurityUploadQueues是数据库中的一个表。 - Spitfire5793
从错误来看,SecurityUploadQueues 属性似乎是一个包含 ExpressionIQueryable,并且可能没有直接指向 DbSet<>。但如果您不展示代码的话,很难确定。 - haim770
我已更新问题,包括有关SecurityUploadQueues属性的详细信息。 - Spitfire5793
1个回答

0

第二个错误意味着您的DataStreamQueues数据库表中有一个列的类型为Int32,但是在DataStreamQueues实体中相应属性的类型为bool;请检查所有列和属性类型是否匹配。
关于第一个异常,有点奇怪!因为此异常表明,在代码的某个地方,您正在对具有多个项的集合调用Single()方法,并且由于Single()仅期望一个项,因此它会抛出异常,但是我没有看到提供的代码中有任何对Single()的调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接