转换为值类型“Int32”失败,因为实现值为null我有以下代码。我收到错误:“转换为值类型'Int32'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。”当CreditHistory表没有记录时。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查询不是作为代码执行,而是转换为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
案例。
根据这个答案,我写了一篇博文,其中详细介绍了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 关注
- 1597 浏览
添加回答
举报
0/150
提交
取消