执行以下查询时,出现错误:
来自物化系统.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; }
}
答案 0 :(得分:50)
我认为数据库表中列的数据类型为Int32
,但您的数据模型有double
。您需要将数据模型的数据类型更改为int
。通过materialized
,它表示在数据库上运行查询时获得的类型。
答案 1 :(得分: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的元素,然后将应用该总和。
答案 2 :(得分:0)
对我来说,我从EF 6中呼叫了stored procedure
,我写了一个poco,但是我没有写存储过程。我需要查看所有具有字段返回数据类型的表。然后将我的Poco从int更改为boolean。
public Boolean Active { get; set; }
答案 3 :(得分:0)
除了其他答案,我还遇到了同样的错误。也就是说,在我们的存储过程中,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