从具体化的“System.Int32”类型到“System.Double”类型的指定转换无效

Posted

技术标签:

【中文标题】从具体化的“System.Int32”类型到“System.Double”类型的指定转换无效【英文标题】:The specified cast from a materialized 'System.Int32' type to the 'System.Double' type is not valid 【发布时间】:2015-08-28 06:09:14 【问题描述】:

执行以下查询时,出现错误:

从物化 'System.Int32' 类型到 “System.Double”类型无效。

var data = ctx.tblTO
                   .Where(m => m.Id == Id)
                   .GroupBy(m => m.EmployeeId)
                   .Select(m => new
                   
                       workDay = m.Sum(k => k.WorkDay),
                       onDutyDay = m.Sum(k => k.OnDutyDay),
                       holiDay = m.Sum(k => k.Holiday)
                   )
                   .FirstOrDefault();

WorkDayOnDutyDayHoliday 的数据类型是double。这里没有Int32,为什么会出现这个错误?

我该如何解决这个错误?

public class TO

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id  get; set;            
    public int EmployeeId  get; set; 
    public double WorkDay  get; set; 
    public double OnDutyDay  get; set; 
    public double Holiday  get; set; 

【问题讨论】:

可以添加tblTO 模型吗? 【参考方案1】:

我认为你的数据库表中列的数据类型是Int32,但你的数据模型有double。您需要将数据模型的数据类型更改为intmaterialized 表示它在数据库上运行查询时获得的类型。

【讨论】:

没错。我将数据库datatypeint 更改为float。现在工作正常。 @Anup,我有这个问题。但是在我的数据库中我有浮动,在我的模型中我也有浮动。我该怎么做才能解决这个问题?这是错误消息:System.InvalidOperationException: 'The specified cast from a materialized 'System.Single' type to the 'System.Double' type is not valid.' @pnet, float 在 sql 中保存 8 个字节的数据,而在 .net 世界中的 float 保存 4 个字节的数据。因此,您可以在代码中使用double 数据类型,也可以在数据库中使用real 数据类型。 请注意。当 db 的返回类型与正在加载的 .net 字段的类型不匹配时,也会发生此错误。 IE。如果您尝试将结果加载到现有类中并且类型不匹配。 我希望将 c# 中的异常详细信息扩展为指示导致此类问题的字段。当很难判断哪个对象为空时,相关的将是对象引用可为空的错误!【参考方案2】:

首先确保你的模型和表列数据类型相同。

尝试将您的查询更改为此。

var data = ctx.tblTO
           .Where(m => m.Id == Id)
           .GroupBy(m => m.EmployeeId)
           .Select(m => new
           
               workDay = m.Select(k => k.WorkDay).DefaultIfEmpty(0).Sum(),
               onDutyDay = m.Select(k => k.OnDutyDay).DefaultIfEmpty(0).Sum(),
               holiDay = m.Select(k => k.Holiday).DefaultIfEmpty(0).Sum()
           )
           .FirstOrDefault();

如果集合为空,则返回一个值为0的元素,然后应用总和。

【讨论】:

我有这个问题,但我的代码不接受`MyProperty = m.Select(..). How can I do? The message is: Liberacao do not contain a definition to Select`...【参考方案3】:

对我来说,我从 EF 6 调用 stored procedure,我写了一个 poco,但我没有写存储过程。我需要查看所有具有字段返回数据类型的表。然后将我的 Poco 从 int 更改为 boolean。

public Boolean Active  get; set; 

【讨论】:

【参考方案4】:

除了其他答案之外,我遇到了另一种情况,我遇到了同样的错误。也就是说,在我们的存储过程中,bigint 被转换为十进制,而在 C# 上,同样的东西被转换为 int64。见:

SELECT Cast(@Request_Id as decimal) AS RetValue

我所做的是将查询更改为:

SELECT @Request_Id AS RetValue

所以,我删除了额外的演员表,问题就消失了。不知何故,它可能引发了某种算术异常,但还不太确定。如果我知道确切原因会尽快更新。

PS:我的@Request_Id 变量的类型是bigint

DECLARE @Request_Id bigint = 0

【讨论】:

以上是关于从具体化的“System.Int32”类型到“System.Double”类型的指定转换无效的主要内容,如果未能解决你的问题,请参考以下文章

从 ASP.NET 调用 Oracle 存储过程时,无法将“System.Int32[]”类型的对象转换为“System.IConvertible”类型

从 'System.Int32' 到 'System.Nullable`1[[System.Int32, mscorlib]] 的无效转换

“System.Int16”类型的对象无法转换为“System.Nullable”1[System.Int32] 类型

InvalidCastException:无法将“System.DBNull”类型的对象转换为“System.Nullable`1[System.Int32]”[重复]

无法在 DataReader.GetString() 中将“System.Int32”类型的对象转换为“System.String”类型

“System.Int32”类型的表达式不能用于返回类型“System.Object”