2010-11-18 24 views
1

我有是伟大的工作LINQ的声明...其选择这儿的一部分是如果一个Sum()值返回Null使用0,目前它将转换为一个可为空的double?

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?(可空双)截至乞讨铸造由于某些值在SUM上返回为NULL。

如果我改变它System.Double它失败,错误

空值不能被分配到与类型System.Double一个部件,其是一种非空值类型

所以我想要做的是返回SUM的值,但如果它是NULL,那么在那里输入一个0。

任何帮助非常感激

回答

5

使用null coalescing operator

double? nullable = null; 
double notNullable = nullable ?? 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() 
}; 
+1

可能会导致异常'g.Sum(p => p.Amount)?? 0).First()'改为使用'g.Sum(p => p.Amount)?? 0).FirstOrDefault()' – 2010-11-18 12:25:26

+0

@Saeed,是的,但我不想改变OP代码的含义 – 2010-11-18 12:59:41

1

只需添加?? 0

变化.First().Expr1).First().Expr1) ?? 0

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); 
0

相反的Sum可以使用Aggregate法的0.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 new 
    { 
     Expr1 = g.Aggregate(0.0, (a, p) => a + p.Amount) 
    }).First().Expr1) 
}; 
相关问题