2016-01-23 97 views
0

我有一個SQL Server數據庫,我的MVC應用程序可以通過實體框架6訪問。我有一個存儲過程,它執行一些總計並將其存儲在臨時表中,然後返回結果通過最後的select語句(簡體版):SQL Server ISNULL和實體框架存儲過程

select isnull(TotalDataShared, 0) as TotalDataShared from #main; 

有跡象表明,TotalDataShared可以爲空的情況下,所以我要檢查它。對於PROC結果自動生成的EF實體看起來是這樣的(也簡化):

public partial class getUsageTotals_Result 
{ 
    public decimal TotalDataShared { get; set; } 
} 

我的回購方法調用這樣的PROC:

public UsageTotals GetCurrentUsage(int accountId) 
    { 
     var ret = _context.getUsageTotals(accountId).First(); 

     return new UsageTotals { 
      DataShared = (double)ret.TotalDataShared 
     }; 
    } 

當#main TotalDataShared不爲空一切工作正常。當它是空的,我讓我的應用程序出現以下錯誤:

上「getUsageTotals_Result」的「TotalDataShared」屬性不能 設定爲'System.Double的價值。您必須將此屬性設置爲類型爲'System.Decimal'的非空值 。

在我看來,它忽略了ISNULL命令。我已經嘗試了將最後一個選擇包裝在表var中,因爲我以前在EF中有臨時表中的數據返回問題,但是沒有任何好處。

我也嘗試使用COALESCE(),它給出了相同的結果。我也嘗試刪除並重新創建在EF中的對象,無濟於事。我也嘗試返回非零浮點值,如果它爲空(ISNULL(TotalDataShared,4.441)),但也不會改變任何東西。

不知道接下來要嘗試什麼。有任何想法嗎?

UPDATE: 添加存儲過程骨架:

create proc getUsageTotals @accountid int 
as 

if object_id('tempdb..#main') is not null drop table #main; 
create table #main ( 

    TotalDataShared float, 
) 

. . . 
. . . 

select isnull(TotalDataShared, 4.441) as TotalDataShared from #main; 

go 

最後兩個PROC的線是選擇和「走出去」,因此,返回值應該是select語句,除非我失去了一些東西。

+0

您能否顯示過程代碼? –

+0

我加了sproc骨架。這是一個簡單的過程,通常的內部連接可以獲得總計並將其插入臨時表中。然後顯示最終選擇。 – Ben

+0

'isnull'返回第一個參數的數據類型。這是'float'映射到'C#'中的double。你爲什麼將它定義爲'decimal'?程序中是否有任何條件邏輯?或者是從早期版本的proc推斷的元數據? –

回答

0

試試這個:

  • 在你的實體框架模型(打開.edmx文件),對 圖表背景,並選擇模型瀏覽器中點擊右鍵。
  • 打開復雜類型樹。
  • 打開您的存儲過程,也許稱爲getUsageTotals_Result。
  • 右鍵單擊TotalDataShared行並選擇屬性。
  • 將可空值更改爲true。

我希望這是你所需要的。

0

如評論所示,如果#main表中沒有結果,則過程返回0行。所以_context.getUsageTotals(accountId)可能會返回零行,並且您可以通過以下方式輕鬆解決:

var ret = _context.getUsageTotals(accountId) 
        .FirstOrDefault(); // FirstOrDefault! 

return new UsageTotals { 
    DataShared = (double)(ret == null ? 0 : ret.TotalDataShared); 
};