首页 新闻 会员 周边

Linq处理decimal字段汇总Sum()为NULL

0
悬赏园豆:20 [已解决问题] 解决于 2014-07-07 13:20

以下语句在查询条件存在数据的时候是正常的,但当表没有数据的时候,查询不到数据的时候就报错了。

var orderQuantity =
ctx.tb_OrderDetail.Where(
od =>
od.ShopCode == jdorder.station_no_isv &&
od.SKU == item.outer_sku_id &&
od.CreateDate >= nowTimeBegin && od.CreateDate <= nowTimeEnd)
.Sum(od => (od.Quantity));

拾梦小侠ด้้้的主页 拾梦小侠ด้้้ | 小虾三级 | 园豆:713
提问于:2014-07-07 10:29
< >
分享
最佳答案
1

因为你的数据中有一个是null求和就是null

要不就把null值筛选掉,要不就弄个默认值0.

收获园豆:6
吴瑞祥 | 高人七级 |园豆:29449 | 2014-07-07 10:54

这个条件加不加是没有任何影响的,因为有数据是不会为空的,现在是因为表没有数据导致错误

拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 11:03

@阿 牛: 对哦.我错了.那返回类型改成可空小数可以不.在where后先select(m=>(decimal?)m.Quantity).sum(m=>m)

大概就是这样意思`语法可能会有问题

吴瑞祥 | 园豆:29449 (高人七级) | 2014-07-07 11:13

@吴瑞祥: 这个语句是没问题的,只是返回的是null,这样就没法达到效果了,需要返回的是数值类型,不然就没法计算了

拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 11:23

@阿 牛: decimal? temp=sum的linq语句

然后decimal value=temp.hasvalue?temp.value:0;

这个为撒还要说明``

吴瑞祥 | 园豆:29449 (高人七级) | 2014-07-07 11:56

@吴瑞祥: 已经用这样的方法了,但是还是不是很好的,因为每一个汇总都需要这样子去处理。如果有linq类似sql语句那样直接可以用isNull来处理。反正简单的说就是用linq直接做到当没有查到数据的时候返回0而不是null

拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 11:59

@阿 牛: sum的linq语句.GetValueOrDefault()会简单一些

吴瑞祥 | 园豆:29449 (高人七级) | 2014-07-07 12:19

@吴瑞祥:  这个可行,谢谢!

拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 13:14
其他回答(12)
0

在Where那加一个 od.Quantity!=null试试

收获园豆:2
Yu | 园豆:12980 (专家六级) | 2014-07-07 10:39

不行,不能加这个条件...

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 10:46

@阿 牛: 那只能先判断有没有数据了,再执行Sum

支持(0) 反对(0) Yu | 园豆:12980 (专家六级) | 2014-07-07 11:19

@Yu: 这个是可以做到的,只是当好几个这样的汇总数据的时候,非常的不方便

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 11:24

@Yu: 谢谢大家的回复!

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 13:14
1

decimal? Quantity

收获园豆:6
Launcher | 园豆:45045 (高人七级) | 2014-07-07 10:45

有其他人也说用这个,但是我都没说怎么用或者不知道...求大神详解下

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 10:55

@阿 牛: 数据库中 Quantity 字段是否设置了允许为 Null ?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-07-07 10:56

@Launcher: 不允许为null

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 11:00

@阿 牛: 不允许为 Null 的话,你又没有连接其它表,怎么能选出值为 Null 的记录了呢?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-07-07 11:03

@Launcher:当表没有数据的时候,汇总的数据就是null, 这就是mssql的弊端...

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 11:09

@阿 牛: 把这个查询生成的 SQL 贴出来看看。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-07-07 11:10

@Launcher: 执行错误了,没法返回语句

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 11:24

@阿 牛: 在你的图中,语句 od => (od.Quantity) 中的 od 的其它值为多少?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-07-07 11:27

@Launcher: 目前是空表,所以查询出来是没有数据的

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 11:29

@阿 牛: 最后返回值处理的问题,这样改:.Sum(od => ((decimal?)od.Quantity))

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-07-07 11:42

@Launcher: 跟楼下的一样, 语句是没问题的,只是返回的是null,这样就没法达到效果了,需要返回的是数值类型,不然就没法计算了

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 11:46

@阿 牛:

.Sum(od => ((decimal?)od.Quantity)).GetValueOrDefault();

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-07-07 13:05

@Launcher: 这个可行,谢谢!

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 13:13

@Launcher: 谢谢大家的回答!

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 13:15

@阿 牛: .Sum(od => new decimal? (od.Quantity)).GetValueOrDefault();

支持(0) 反对(0) C#开发人员 | 园豆:181 (初学一级) | 2014-07-07 13:15

@C#开发人员: 谢谢。这个可以的

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 13:16
0

sqlserver就这样,没有的话就给你来一个null

你做一个+0

收获园豆:2
迅捷网络[来送福利] | 园豆:576 (小虾三级) | 2014-07-07 10:48

现在就是在linq不知道怎么处理...

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 10:53

@阿 牛: 谢谢大家的回答!

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 13:15

谢谢大家的回答!

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 13:15
0

你可以先用.Any()判断一下是否能取到数据,再用.Sum()求和。

还有个办法可以用decimal? sum=query.Sum(q=>q.Quantity);

然后就可以用sum.HasValue()判断是否有值了。

收获园豆:2
Alex_QY1987 | 园豆:1888 (小虾三级) | 2014-07-07 11:45

这个是可以的,只是当多个汇总(不是多列值汇总,是多个查询表汇总)每个都要写一次就太麻烦了,就想避免这样的麻烦,类似sql语句那样直接可以用isNull来处理。反正简单的说就是用linq直接做到当没有查到数据的时候返回0而不是null.可有办法?

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 11:57

谢谢大家的回答!

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 13:15
0

linq 有许多的 解析器,你的是 linq to sql还是linq to ef?

收获园豆:2
Qlin | 园豆:2403 (老鸟四级) | 2014-07-07 12:01

ef

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 12:46

谢谢大家的回答!

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2014-07-07 13:16
0

  去年的问题了啊,说下我的做法,写一个扩展方法sumordefault 在这个里面写判断是否存在记录,若不存在则返回默认值 在linq to ef中是可以识别出来的 而且调用也很方便

AndioM | 园豆:214 (菜鸟二级) | 2015-06-29 15:22
0

.Sum(od => (decimal?)od.Quantity).GetValueOrDefault();

今天也遇到了,记录一下。

Herb | 园豆:6 (初学一级) | 2015-07-12 22:23
0

我去,我也遇到这个问题了,记录一下

.Sum(od => (decimal?)od.Quantity).GetValueOrDefault();

Engineer | 园豆:331 (菜鸟二级) | 2015-11-16 18:11
0

今天遇到了

.Sum(od => (decimal?)od.Quantity).GetValueOrDefault();

这样已经可以顺利解决

心在旅途 | 园豆:202 (菜鸟二级) | 2016-04-09 15:02

必须的...

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2016-04-11 19:06
0

.Sum(od => (decimal?)od.Quantity).GetValueOrDefault();

 

  

        var ef = this.dbContent.nContext;
            var first = ef.W_Members.Where(p => p.ReferralDist == MemberDist);
            IQueryable<MemberInfo> query = from c in first
                                           join p in ef.W_Personal
                                           on c.Dist equals p.MemberDist
                                           join b in ef.W_Btc on c.Dist equals b.MemberDist
                                           select new MemberInfo
                                           {
                                               MemberDist = c.Dist,
                                               Added = c.Added.Value.ToString(),
                                               Email = p.Email,
                                               ReferralDist = c.ReferralDist.Value,
                                               FullName = p.FullName,
                                               MemberCode = c.MemberCode,
                                               Status = c.Status.Value,
                                               ContactNo = p.ContactNo,
                                               PH = ef.W_ProvideHelp.Where(h => h.MemberDist == c.Dist).Sum(od => (decimal?)od.Amount).GetValueOrDefault(),
                                               IsPH = c.IsHP.Value,
                                               IsTree = c.IsTree.Value,
                                               TotalBTC = b.Balance.Value
                                           };

好奇怪你们的可以,我的怎么不行?

 

 

武琥 | 园豆:5 (初学一级) | 2016-08-14 23:20

你发的图没法看,错误是怎么样的也看不到哦

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2016-08-15 09:01
0

total = query.Select(l => l.Price).DefaultIfEmpty(0m).Sum(); 

小輝 | 园豆:196 (初学一级) | 2017-11-10 11:01
0

这个问题确实挺困扰的,

我用.Sum(od => ((decimal?)od.Quantity)).GetValueOrDefault();报错,说linq to ef 不支持 GetValueOrDefault(),

然后我觉得“到值类型decimal的强制转换失败,原因是null”,并不是Sum()过程中报的错,Sum()处理Null的时候应该返回的也是Null,然后在最后赋值给decimal类型变量的时候出的错。

然后我尝试.Sum(od => (decimal?)od.Quantity) ?? 0;可以。

dbidbii | 园豆:202 (菜鸟二级) | 2018-06-19 13:14

好久的问题了,能解决就行,现在也少用ef了

支持(0) 反对(0) 拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2018-06-19 13:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册