轉換為值類型“Int32”失敗,因為實現(xiàn)值為null我有以下代碼。我收到錯誤:“轉換為值類型'Int32'失敗,因為具體化值為null。結果類型的泛型參數(shù)或查詢必須使用可空類型?!碑擟reditHistory表沒有記錄時。var creditsSum = (from u in context.User
join ch in context.CreditHistory on u.ID equals ch.UserID
where u.ID == userID select ch.Amount).Sum();如何修改查詢以接受空值?
3 回答

寶慕林4294392
TA貢獻2021條經驗 獲得超8個贊
linq-to-sql查詢不是作為代碼執(zhí)行,而是轉換為SQL。有時,這是一種“漏洞抽象”,會產生意外行為。
一個這樣的情況是空處理,其中在不同的地方可能存在意外的空值。...DefaultIfEmpty(0).Sum(0)
可以幫助這個(非常簡單)的情況,其中可能沒有元素和sql的SUM
返回,null
而c#期望0。
更通用的方法是使用在生成的SQL返回意外的null的風險時??
將其轉換為COALESCE
:
var creditsSum = (from u in context.User join ch in context.CreditHistory on u.ID equals ch.UserID where u.ID == userID select (int?)ch.Amount).Sum() ?? 0;
這首先強制int?
告訴C#編譯器這個表達式確實可以返回null
,即使Sum()
返回一個int
。然后我們使用普通??
運算符來處理這個null
案例。
根據(jù)這個答案,我寫了一篇博文,其中詳細介紹了LINQ to SQL和LINQ to Entities。

偶然的你
TA貢獻1841條經驗 獲得超3個贊
要允許可空Amount
字段,只需使用null合并運算符將空值轉換為0。
var creditsSum = (from u in context.User join ch in context.CreditHistory on u.ID equals ch.UserID where u.ID == userID select ch.Amount ?? 0).Sum();
- 3 回答
- 0 關注
- 1673 瀏覽
添加回答
舉報
0/150
提交
取消