从物化的'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();
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; }
}
我认为数据库表内列的数据类型是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