我有下面的代码。我搞错了:
“转换为值类型'Int32‘失败,因为物化值为空。结果类型的泛型参数或查询必须使用可空类型。”
当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();如何修改查询以接受空值?
发布于 2011-07-28 19:12:20
linq到SQL查询不是以代码的形式执行,而是转换为SQL。有时,这是一种“漏出的抽象”,会产生意想不到的行为。
其中一种情况是null处理,其中可能在不同的地方出现意外的空值。在这种情况下,...DefaultIfEmpty(0).Sum(0)可以提供帮助(非常简单),在这种情况下,可能没有元素,而sql的SUM返回null,而c#预期为0。
一种更普遍的方法是使用??,当生成的COALESCE有返回意外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和LINQ实体的详细信息。
https://stackoverflow.com/questions/6864311
复制相似问题