Linq 表达式Sum 抛出“不能将 Null 值赋给类型为 System.Decimal (不可为 null 的值类型)的成员”的最佳解决方法

原创 2012年03月30日 08:55:24
昨天Linq 使用Sum 表达式抛出了“不能将 Null 值赋给类型为 System.Decimal (不可为 null 的值类型)的成员”
 
var val = dc.DailyData.Where(x => x.ValueTime == DateTime.Now).Sum(x => x.TodayPower);

检查了一下生成的SQL语句,结果如下:


{SELECT SUM([t0].[TodayPower]) AS [value]
FROM [dbo].[DailyData] AS [t0]
WHERE [t0].[ValueTime] = @p0
-- @p0: Input DateTime (Size = 0; Prec = 0; Scale = 0) [2012/3/29 0:00:00]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.5420


}


Google了一下,有一个有人提出了强转http://www.cnblogs.com/mine/archive/2009/02/27/1399770.html
于是代码改成如下:
var val = dc.DailyData.Where(x => x.ValueTime == DateTime.Now).Sum(x => (decimal?)x.TodayPower);

不过再检查了生成的SQL语句发现生成的查询语句变成了如下:


{SELECT SUM([t1].[value]) AS [value]
FROM (
    SELECT [t0].[TodayPower] AS [value], [t0].[ValueTime]
    FROM [dbo].[DailyData] AS [t0]
    ) AS [t1]
WHERE [t1].[ValueTime] = @p0
-- @p0: Input DateTime (Size = 0; Prec = 0; Scale = 0) [2012/3/29 17:31:18]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.5420


}


查了一下MSDN,对于SUM函数重载的说明都基本相同,没有特别之处。最后我尝试了一下使用 as运算符,居然有惊人的发现,生成了最优的SQL语句了。
var val = dc.DailyData.Where(x => x.ValueTime == DateTime.Now).Sum(x =>x.TodayPower as decimal?);

生成的SQL语句如下:
{SELECT SUM([t0].[TodayPower]) AS [value]
FROM [dbo].[DailyData] AS [t0]
WHERE [t0].[ValueTime] = @p0
-- @p0: Input DateTime (Size = 0; Prec = 0; Scale = 0) [2012/3/29 17:47:04]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.5420


}

linq sum source为空的两种处理方式

total = query.Select(l => l.Price).DefaultIfEmpty(0m).Sum();  // Exceptions:  //   System.Argument...
  • hejisan
  • hejisan
  • 2016年10月11日 10:45
  • 1010

使用Linq求和方法Sum计算集合中多个元素和时应该注意的性能问题

提出问题 本文使用下面的实例来说明问题,以下是实例的完整代码。 //************************************************************ /...
  • tiana0
  • tiana0
  • 2014年09月10日 22:40
  • 8943

EF中Sum()异常:到值类型“System.Decimal”的强制转换失败,因为具体化值为 null。

一、使用EF访问数据库求和时经常遇到这样的异常 “System.InvalidOperationException”类型的未经处理的异常在 EntityFramework.dll 中发生  其他信息...

可空类型"int?" 解决: 【数据库里的int类型可以为null,而在c#里int类型不能为Nul】的问题

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 可空数...

C#的可空类型、decimal相关

今天,我的C#代码抛异常了。代码如下,是RPC自动生成的代码。 static decimal? C(double x) { return double.IsNaN(x) ? null : (dec...

CSS按比例等分box,并显示分隔线

CSS按比例等分box,并显示分隔线,看着简单,做起来不易的功能

Action<T>和Func<T>泛型委托

1.泛型Action委托表示引用一个void返回类型的方法。因为这个委托类存在不同的变体,所以可 以传递至多16种不同的参数类型。没有泛型参数的Action类可调用没有参数的方法。Action 调...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linq 表达式Sum 抛出“不能将 Null 值赋给类型为 System.Decimal (不可为 null 的值类型)的成员”的最佳解决方法
举报原因:
原因补充:

(最多只允许输入30个字)