从物化的'System.Int32'键入'System.Double'类型无效

本文关键字:System Double 类型 无效 键入 Int32 | 更新日期: 2023-09-27 18:10:22

当执行以下查询时,我得到错误:

来自物化'系统'的指定强制类型。类型为Int32'的系统。

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; }
}

从物化的'System.Int32'键入'System.Double'类型无效

我认为数据库表内列的数据类型是Int32,但你的数据模型有double。您需要将数据模型的数据类型更改为int。这里的materialized是指在数据库上运行查询时得到的类型。

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

尝试将您的查询更改为此

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的元素,然后应用求和。

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

public Boolean Active { get; set; }

除了其他答案,我还遇到了另一个场景,我遇到了同样的错误。也就是说,在我们的存储过程中,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