来自物化系统.Int32'的指定演员表。输入' System.Double'类型无效

时间:2015-08-28 06:09:14

标签: c# asp.net-mvc linq

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

  

来自物化系统.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; }
}

4 个答案:

答案 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