繁体   English   中英

LINQ .SUM()和可空的db值

[英]LINQ .SUM() and nullable db values

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

目前我有:

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.

什么是正确的语法?

我很惊讶失败了,但是一个可能有用的替代方法就是对可空值进行求和然后使用null合并运算符:

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

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

如何排除空值,即

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

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

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

    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;

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

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

var expense =来自db.I_ITEM中的e,其中e.ExpenseId == expenseId select e;

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

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

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

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

这里,求和可以为空(double?)。 如果你使它不可为空,那么使用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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM