【问题标题】:Linq Errors on ToList(), Any(), Count(), Sum()ToList()、Any()、Count()、Sum() 上的 Linq 错误
【发布时间】: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;。但是如果不显示代码就很难判断

标签: c# entity-framework linq


【解决方案1】:

second 错误意味着您的DataStreamQueues 数据库表中有一个类型为Int32 的列,但DataStreamQueues 实体中等效属性的类型是bool;所以检查所有列和属性类型是否匹配。
关于first异常,有点奇怪!因为此异常表明您在代码中的某处调用了具有多个项目的集合上的 Single() 方法,并且由于 Single() 只需要一个项目,它会引发异常,但是我没有看到对 Single() 的任何调用在提供的代码中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多