LINQ .SUM()和可空的db值

时间:2011-03-01 12:49:07

标签: c# linq

我知道为什么会这样,但是有人能指出我正确的语法方向吗?

目前我有:

var expense = from e in db.I_ITEM
              where e.ExpenseId == expenseId
              select e;

return expense.Sum(x => x.Mileage ?? 0);

我的问题是x.Mileage的类型是“double?”并且在db中具有空值。

我得到的错误是:

Exception Details: System.InvalidOperationException: The cast to value type 'Double' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

正确的语法是什么?

6 个答案:

答案 0 :(得分:19)

我很惊讶失败了,但可能工作的另一种选择只是将可空值加起来然后然后使用空合并运算符:

return expense.Sum(x => x.Mileage) ?? 0d;

当然,在LINQ to Objects中,如果序列中没有非空值,则会做正确的事情,忽略空值并给出空结果(在空合并运算符之前)。

答案 1 :(得分:5)

如何排除空值,即

var expense = 
          from e in db.I_ITEM
          where (e.ExpenseId == expenseId) && (e.Mileage.HasValue)
          select e;

 return expense.Sum(x => x.Mileage);

答案 2 :(得分:1)

可能会给你一个意见......

    decimal depts = 0;

    var query = from p in dc.Payments
                where p.UserID == UserID
                select p.Amount;

    if (query.Count() > 0)
    {
        depts = query.Sum();
    }

    return depts;

答案 3 :(得分:0)

您使用的是哪个O / R映射器,以及您使用的是哪个数据库? (Linq to SQL / Entity Framework / SQL Server)?

由于表达式在DB中作为SQL语句执行,我认为它可以在没有合并运算符的情况下工作:

var expense =来自db.I_ITEM中的e               其中e.ExpenseId == expenseId               选择e;

返回费用.Sum(x => x.Mileage);

答案 4 :(得分:0)

var expense = (from e in db.I_ITEM
              where e.ExpenseId == expenseId
              select e.Mileage??0D);
return expense.Sum();

答案 5 :(得分:0)

空字段: 如果计算中的字段可为空,则无需执行任何特殊操作。只需按原样使用 sum 即可,如下所示:

var summation = expense.Sum(x => x.Mileage);

在这里,总和为可为空(双精度)。如果将其设置为不可为空,则使用 null合并运算符 ,并设置默认值0(零),如下所示:

var summation = expense.Sum(x => x.Mileage) ?? 0d;

不可为空字段: 但是,如果计算中的字段不可为空,则需要首先强制将可为空的字段进行求和,如下所示:

var summation = expense.Sum(x => (double?)x.Mileage);

在这里,总和是可为空的(双精度?)。如果将其设置为不可为空,则使用 null合并运算符 ,如下所示:

var summation = expense.Sum(x => (double?)x.Mileage)?? 0d;