C# 如果Sum()值返回Null use 0,则当前是否将其强制转换为可为Null的双精度?

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 {

我有一个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
     {
         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代码的含义