How to do Linq aggregates when there might be an empty set?

前端 未结 4 1780
醉酒成梦
醉酒成梦 2020-12-06 01:13

I have a Linq collection of Things, where Thing has an Amount (decimal) property.

I\'m trying to do an aggregate on this for a

4条回答
  •  天涯浪人
    2020-12-06 01:51

    I can reproduce your problem with the following LINQPad query against Northwind:

    Employees.Where(e => e.EmployeeID == -999).Sum(e => e.EmployeeID)
    

    There are two issues here:

    1. Sum() is overloaded
    2. LINQ to SQL follows SQL semantics, not C# semantics.

    In SQL, SUM(no rows) returns null, not zero. However, the type inference for your query gives you decimal as the type parameter, instead of decimal?. The fix is to help type inference select the correct type, i.e.:

    Employees.Where(e => e.EmployeeID == -999).Sum(e => (int?)e.EmployeeID)
    

    Now the correct Sum() overload will be used.

提交回复
热议问题