以下语句在查询条件存在数据的时候是正常的,但当表没有数据的时候,查询不到数据的时候就报错了。
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));
因为你的数据中有一个是null求和就是null
要不就把null值筛选掉,要不就弄个默认值0.
这个条件加不加是没有任何影响的,因为有数据是不会为空的,现在是因为表没有数据导致错误
@阿 牛: 对哦.我错了.那返回类型改成可空小数可以不.在where后先select(m=>(decimal?)m.Quantity).sum(m=>m)
大概就是这样意思`语法可能会有问题
@吴瑞祥: 这个语句是没问题的,只是返回的是null,这样就没法达到效果了,需要返回的是数值类型,不然就没法计算了
@阿 牛: decimal? temp=sum的linq语句
然后decimal value=temp.hasvalue?temp.value:0;
这个为撒还要说明``
@吴瑞祥: 已经用这样的方法了,但是还是不是很好的,因为每一个汇总都需要这样子去处理。如果有linq类似sql语句那样直接可以用isNull来处理。反正简单的说就是用linq直接做到当没有查到数据的时候返回0而不是null。
@阿 牛: sum的linq语句.GetValueOrDefault()会简单一些
@吴瑞祥: 这个可行,谢谢!
在Where那加一个 od.Quantity!=null试试
不行,不能加这个条件...
@阿 牛: 那只能先判断有没有数据了,再执行Sum
@Yu: 这个是可以做到的,只是当好几个这样的汇总数据的时候,非常的不方便
@Yu: 谢谢大家的回复!
decimal? Quantity
有其他人也说用这个,但是我都没说怎么用或者不知道...求大神详解下
@阿 牛: 数据库中 Quantity 字段是否设置了允许为 Null ?
@Launcher: 不允许为null
@阿 牛: 不允许为 Null 的话,你又没有连接其它表,怎么能选出值为 Null 的记录了呢?
@Launcher:当表没有数据的时候,汇总的数据就是null, 这就是mssql的弊端...
@阿 牛: 把这个查询生成的 SQL 贴出来看看。
@Launcher: 执行错误了,没法返回语句
@阿 牛: 在你的图中,语句 od => (od.Quantity) 中的 od 的其它值为多少?
@Launcher: 目前是空表,所以查询出来是没有数据的
@阿 牛: 最后返回值处理的问题,这样改:.Sum(od => ((decimal?)od.Quantity))
@Launcher: 跟楼下的一样, 语句是没问题的,只是返回的是null,这样就没法达到效果了,需要返回的是数值类型,不然就没法计算了
@阿 牛:
.Sum(od => ((decimal?)od.Quantity)).GetValueOrDefault();
@Launcher: 这个可行,谢谢!
@Launcher: 谢谢大家的回答!
@阿 牛: .Sum(od => new decimal? (od.Quantity)).GetValueOrDefault();
@C#开发人员: 谢谢。这个可以的
sqlserver就这样,没有的话就给你来一个null
你做一个+0
现在就是在linq不知道怎么处理...
@阿 牛: 谢谢大家的回答!
谢谢大家的回答!
你可以先用.Any()判断一下是否能取到数据,再用.Sum()求和。
还有个办法可以用decimal? sum=query.Sum(q=>q.Quantity);
然后就可以用sum.HasValue()判断是否有值了。
这个是可以的,只是当多个汇总(不是多列值汇总,是多个查询表汇总)每个都要写一次就太麻烦了,就想避免这样的麻烦,类似sql语句那样直接可以用isNull来处理。反正简单的说就是用linq直接做到当没有查到数据的时候返回0而不是null.可有办法?
谢谢大家的回答!
linq 有许多的 解析器,你的是 linq to sql还是linq to ef?
ef
谢谢大家的回答!
去年的问题了啊,说下我的做法,写一个扩展方法sumordefault 在这个里面写判断是否存在记录,若不存在则返回默认值 在linq to ef中是可以识别出来的 而且调用也很方便
.Sum(od => (decimal?)od.Quantity).GetValueOrDefault();
今天也遇到了,记录一下。
我去,我也遇到这个问题了,记录一下
.Sum(od => (decimal?)od.Quantity).GetValueOrDefault();
今天遇到了
.Sum(od => (decimal?)od.Quantity).GetValueOrDefault();
这样已经可以顺利解决
必须的...
.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
};
好奇怪你们的可以,我的怎么不行?
你发的图没法看,错误是怎么样的也看不到哦
total = query.Select(l => l.Price).DefaultIfEmpty(0m).Sum();
这个问题确实挺困扰的,
我用.Sum(od => ((decimal?)od.Quantity)).GetValueOrDefault();报错,说linq to ef 不支持 GetValueOrDefault(),
然后我觉得“到值类型decimal的强制转换失败,原因是null”,并不是Sum()过程中报的错,Sum()处理Null的时候应该返回的也是Null,然后在最后赋值给decimal类型变量的时候出的错。
然后我尝试.Sum(od => (decimal?)od.Quantity) ?? 0;可以。
好久的问题了,能解决就行,现在也少用ef了