2015-08-28 173 views
28

上執行下面的查詢,我得到的錯誤: - 從LINQ的 - 從物化「System.Int32」類型指定的強制轉換到「System.Double」類型無效

指定的強制轉換物化'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; } 
} 
+0

請問您可以添加'tblTO'模型嗎? –

回答

34

我認爲列的數據庫表中的數據類型是Int32但你的數據模型double。您需要將數據模型的數據類型更改爲int。通過materialized它意味着它在數據庫上運行查詢時獲得的類型。

+0

沒錯。我將數據庫'datatype'從'int'改爲'float'。現在工作正常。 – Anup

+2

@Anup,我有這個問題。但在我的數據庫中,我有浮動,在我的模型中,我也浮動。我該如何解決這個問題?這是錯誤消息:'System.InvalidOperationException:'從物化'System.Single'類型到'System.Double'類型的指定強制轉換無效.'' – pnet

+0

@pnet,sql中的'float'持有8個字節而.net世界中的「float」數據則保存4個字節的數據。所以你可以在你的代碼中使用'double'數據類型,或者你可以在你的數據庫上使用'真正'數據類型。 – Yohannes

1

首先確保您的模型和表格列數據類型相同。

嘗試將您的查詢更改爲此。

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的元素,然後應用總和。

+0

我有這個問題,但我的代碼不接受'MyProperty = m.Select(....)'。我能怎麼做?消息是:Liberacao不包含「選擇」的定義... – pnet

相關問題