使用聚合函数的问题

yaojunyi3725 2014-09-22 04:22:34
先贴代码

var outmodel = (from t1 in db.DeleverInfo
join t2 in db.CkHopeInfo
on t1.HopeInfoId equals t2.Identifier
where t2.GoodsId == goodsId
select t1.GoodsNum.GetValueOrDefault());
var outModel2 = (from t1 in db.DeleverInfo
join t2 in db.CkHopeInfo
on t1.HopeInfoId equals t2.Identifier
where t2.GoodsId == goodsId
select t1.GoodsNum);
//var outNum = outmodel.Sum();
var outNum2 = outModel2.Sum().GetValueOrDefault();

上面是两种求和的方式 第一种如果其中一条记录的数值为null可以看做0,但是如果没有记录那么.sum()是会报错的
第二种即使不存在记录也会返回0而不会报错但是如果有记录并且其中一条记录的数值为null那么求和为null
我希望查询时给每条记录的数值字段加上GetValueOrDefault保证即使有值为null也能求出数值 当然没有记录时不能报错
目前想到的方法是第一种方法得到outmodel 后判断count()是否大于0,如果大于零再去求和
但是觉得比较麻烦 大家有什么好的方法能解决这个需求吗
...全文
341 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaojunyi3725 2014-09-30
  • 打赏
  • 举报
回复
引用 5 楼 moonwrite 的回复:
var outNum2 = outModel2.GetValueOrDefault(0).Sum();
outModel2是个集合不是元素没有GetValueOrDefault()方法
yaojunyi3725 2014-09-30
  • 打赏
  • 举报
回复
引用 4 楼 q107770540 的回复:
var outmodel = (from t1 in db.DeleverInfo
                          join t2 in db.CkHopeInfo
                          on t1.HopeInfoId equals t2.Identifier
                          where t2.GoodsId == goodsId
                          select t1.GoodsNum==null?0:t1.GoodsNum);

  var outNum =outmodel.Any()? outmodel.Sum():0;
和1楼的方式是一样的 可能也没有太麻烦加个判断而已
moonwrite 2014-09-30
  • 打赏
  • 举报
回复
引用 8 楼 yaojunyi3725 的回复:
[quote=引用 5 楼 moonwrite 的回复:] var outNum2 = outModel2.GetValueOrDefault(0).Sum();
outModel2是个集合不是元素没有GetValueOrDefault()方法[/quote] 搞错了~不好意思~ var total = query.Select(x => x.Amount).DefaultIfEmpty(0).Sum();
狸丶不乖 2014-09-23
  • 打赏
  • 举报
回复
扩展linq的操作符吧
moonwrite 2014-09-22
  • 打赏
  • 举报
回复
var outNum2 = outModel2.GetValueOrDefault(0).Sum();
q107770540 2014-09-22
  • 打赏
  • 举报
回复
var outmodel = (from t1 in db.DeleverInfo
                          join t2 in db.CkHopeInfo
                          on t1.HopeInfoId equals t2.Identifier
                          where t2.GoodsId == goodsId
                          select t1.GoodsNum==null?0:t1.GoodsNum);

  var outNum =outmodel.Any()? outmodel.Sum():0;
yaojunyi3725 2014-09-22
  • 打赏
  • 举报
回复
引用 2 楼 gxingmin 的回复:
或者 var outNum=outmodel.DefaultIfEmpty().Sum();
这种方式看起来很优雅 我之前对DefaultIfEmpty()的运用仅限于left join 但是这并不可行 错误提示"无法设置节点“OptionalValue”的格式以作为 SQL 执行。"
gxingmin 2014-09-22
  • 打赏
  • 举报
回复
或者 var outNum=outmodel.DefaultIfEmpty().Sum();
gxingmin 2014-09-22
  • 打赏
  • 举报
回复
第一种但是如果没有记录那么.sum()是会报错的 ======== 加个判断呗 var outNum=0; if(outmodel.Count()>0) outNum=outmodel.Sum();

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧