2017-03-01 65 views
0

LINQ查詢給了我如下所示的錯誤:LINQ數總和法錯誤

錯誤

無法轉換類型'System.Double爲鍵入「System.Nullable'1的對象[System.Single]」。

LINQ查詢

using (gEn myEntities = new gEn) 
{ 
    var load = (from items in myEntities.Orders 
    select items.PayO).Sum(); 
} 

型號

Public class Order 
{ 
    Public int OrdersId {get; set;} 
    Public float? PayO {get; set;} 
} 

注意

  1. SQL Server 2012中對應的訂單表的PayO列是real類型的,並且其所有的值都大於零(如果該事項)
  2. 出於測試目的,在上面的查詢,如果我更換選擇items.PayO由,例如,select 2LINQ查詢可以正常工作,並返回與表中行數相同的重複次數2。例如,如果表格有4行,則LINQ查詢將返回8(即2 + 2 + 2 + 2)
+2

廣東話重複這個在所有 - 根據您的自稱是什麼代碼不會拋出錯誤。 –

+0

看看[msdn上的這張表](https://msdn.microsoft.com/en-us/library/bb896344(v = vs.110))。aspx),你可以看到'float'和'real'類型映射到'Edm.Double'。你的模型數據類型應該是'double?'。 – spender

+0

PayO是否持有貨幣價值?如果是這樣,「真實」將是不適當的數據類型選擇。 – spender

回答

1

我懷疑(此時不能證明),您有問題與查詢物質化!

當你執行這個查詢:

var load = (from items in myEntities.Orders 
    select items.PayO).Sum(); 

它將被翻譯成該查詢:

SELECT SUM(PayO) FROM Order; 

在這一點上,您的查詢無法處理null值!

但是,當你這樣做(這是我在評論中提及以上):

var pays = (from items in myEntities.Orders select items.PayO).ToList(); 

您的查詢將被執行,你將不得不在內存中的float?列表。此時您可以執行聚合,因爲Sum()is able to handlenull值。

var load = pays.Sum(); 

load是你的總和。

+0

正如我在上面的筆記1中提到的,所有的值都不是可空的(即> 0)。但是,我認爲你和用戶'@ StephenMuecke'在上面已經懷疑過,你執行'ToList()'時,你的建議解決方案(工作)可能與內存列表有關。感謝您澄清問題的可能原因及其可行的解決方案。 – nam

0

從我在代碼中看到的內容。 PayO可以爲空,並且錯誤清楚地表明它不能將null轉換爲double。 所以,你需要更新你的查詢像

using (gEn myEntities = new gEn) 
{ 
    var load = (from items in myEntities.Orders 
    where items.PayO != NULL 
    select items.PayO).Sum(); 
} 
+0

@Amin I曾嘗試過,但無濟於事。 – nam