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

问题描述 投票:0回答:5

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

从具体化的“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();

WorkDay
OnDutyDay
Holiday
的数据类型为
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; }
}
c# asp.net-mvc linq
5个回答
74
投票

我认为数据库表中列的数据类型是

Int32
,但你的数据模型有
double
。您需要将数据模型的数据类型更改为
int
materialized
表示在数据库上运行查询时获得的类型。


3
投票

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

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

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


1
投票

除了其他答案之外,我还遇到了另一个遇到同样错误的情况。也就是说,在我们的存储过程中,

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

0
投票

对我来说,我从 EF 6 中调用了

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

public Boolean Active { get; set; }

0
投票

我得到了同样类型的错误,例如“System.InvalidOperationException:'从物化'System.Int16类型到System.Int32'类型的指定转换无效。” 在花了很多时间分析之后 我终于得到了答案。我在模型中使用 int (System.Int32) 数据类型作为属性 XYZ,并且数据库表中相应的映射字段使用smallint。

因此我必须对 XYZ 属性使用数据类型 Int16 (System.Int16),它解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.