2010-03-02 3 views
8

Я создаю метод, который собирает накопленные суммы за весь месяц. Проблема в том, что некоторые товары за определенный месяц могут не взиматься, поэтому никакие строки не будут возвращены.Linq to Sql Sum без записей

я могу видеть, как это будет ошибкой, без данных:

double fuelCost = (double)(from a in db.EquipmentFuelLogs 
          where a.wdEquipmentMainGeneralOID == vehicleKey &&  
           (monthBeginDate < a.Date1 && a.Date1 < monthEndDate) 
          select a.TotalCost).Sum(); 

Каков наилучший подход не обнаружить ни одного топлива транзакций для этого месяца и установить стоимость топлива на 0? Просто попытайтесь поймать? This article говорил о проблеме, но никакого решения.

+1

см http://stackoverflow.com/a/2456670/463425 .Select (а => (дважды) a.TotalCost?) .sum(); – tkerwood

ответ

-10

Я добавил уловку, чтобы поймать ошибку. Я не нашел другого решения.

15

Проблема в том, что там, где не возвращается последовательность, за которую сумма не может работать, однако, если вы используете .DefaultIfEmpty до суммы, она отлично работает.

decimal? orderValue = 
    orders.Where(ee => ee.Name == "SomeName").DefaultIfEmpty().Sum(s => s.OrderCost); 

Надеюсь, это поможет.

+0

Я попробую это в следующий раз, когда мне это нужно. –

+3

Не работает с Linq to SQL – jeromeyers

5

Я решил:

decimal orderValue = orders.Where(ee => ee.Name == "SomeName").Sum(s => (decimal?)s.OrderCost)??0;