C# 如果Sum()值返回Null use 0,则当前是否将其强制转换为可为Null的双精度?
我有一个LINQ声明,它非常有效。。。它是选择的一部分C# 如果Sum()值返回Null use 0,则当前是否将其强制转换为可为Null的双精度?,c#,linq,group-by,nullable,sum,C#,Linq,Group By,Nullable,Sum,我有一个LINQ声明,它非常有效。。。它是选择的一部分 select new { Net = (System.Double?) ((from m0 in MOVTOS where m0.DocumentType == "NET" && m0.ClientCode == c.ClientCode group m0 by new { 0.ClientCode } into g select new {
select new
{
Net = (System.Double?)
((from m0 in MOVTOS
where m0.DocumentType == "NET" && m0.ClientCode == c.ClientCode
group m0 by new { 0.ClientCode } into g
select new
{
Expr1 = (System.Double)g.Sum(p => p.Amount)
}).First().Expr1)
};
现在,如果您注意到我正在使用System.Double?
(可为NULL的Double)作为begging的强制转换,因为一些值在求和时返回为NULL
如果我把它改成System.Double,它会出错
无法将null值分配给System.Double类型的成员,该类型是不可为null的值类型
所以我想做的是返回SUM的值,但是如果它为NULL,那么在那里输入一个0
非常感谢您的帮助请使用:
就你而言:
select new
{
Net =
(from m0 in MOVTOS
where m0.DocumentType == "NET" && m0.ClientCode == c.ClientCode
group m0 by new { 0.ClientCode } into g
select g.Sum(p => p.Amount) ?? 0).First()
};
使用:
就你而言:
select new
{
Net =
(from m0 in MOVTOS
where m0.DocumentType == "NET" && m0.ClientCode == c.ClientCode
group m0 by new { 0.ClientCode } into g
select g.Sum(p => p.Amount) ?? 0).First()
};
只需添加
??0
将
.First().Expr1)
更改为.First().Expr1)??0
只需添加??0
将
.First().Expr1)
更改为.First().Expr1)??0
或者您可以相应地过滤您的收藏g
List<double?> dArr = new List<double?>( )
{
1,
3,
null,
5
};
double sum = dArr.Select( item =>
{
if( item.HasValue == false )
return 0;
else
return item;
} ).Sum( item => item.Value );
List dArr=新列表()
{
1.
3.
无效的
5.
};
双倍总和=dArr.选择(项目=>
{
if(item.HasValue==false)
返回0;
其他的
退货项目;
}).Sum(项目=>item.Value);
或者您可以相应地过滤您的收藏g
List<double?> dArr = new List<double?>( )
{
1,
3,
null,
5
};
double sum = dArr.Select( item =>
{
if( item.HasValue == false )
return 0;
else
return item;
} ).Sum( item => item.Value );
List dArr=新列表()
{
1.
3.
无效的
5.
};
双倍总和=dArr.选择(项目=>
{
if(item.HasValue==false)
返回0;
其他的
退货项目;
}).Sum(项目=>item.Value);
您可以使用种子为0.0
的Aggregate
方法,而不是Sum
。这不需要使用可空类型或显式强制转换
select new
{
Net =
((from m0 in MOVTOS
where m0.DocumentType == "NET" && m0.ClientCode == c.ClientCode
group m0 by new { 0.ClientCode } into g
select new
{
Expr1 = g.Aggregate(0.0, (a, p) => a + p.Amount)
}).First().Expr1)
};
您可以使用种子为
0.0
的Aggregate
方法,而不是Sum
。这不需要使用可空类型或显式强制转换
select new
{
Net =
((from m0 in MOVTOS
where m0.DocumentType == "NET" && m0.ClientCode == c.ClientCode
group m0 by new { 0.ClientCode } into g
select new
{
Expr1 = g.Aggregate(0.0, (a, p) => a + p.Amount)
}).First().Expr1)
};
可能导致异常
g.Sum(p=>p.Amount)??0).首先()
使用g.Sum(p=>p.Amount)??0).FirstOrDefault()
@Saeed,是的,但我不想更改OP代码的含义可能导致异常g.Sum(p=>p.Amount)??0).首先()
使用g.Sum(p=>p.Amount)??0).FirstOrDefault()
@Saeed,是的,但我不想更改OP代码的含义