2015-02-24 12 views
0

У меня есть запрос, который я преобразовал в выражение LINQ. Но бросает исключение Null.sql to LINQ с левой группой join by и sum() throws exception

Цель: Тип платежа может иметь три значения (0,1,2). Мне нужно запросить общую сумму суммы для всей валюты для всех трех типов PaymentType. Также, если запись для определенной валюты не существует ни для одного из трех значений paymentType. Сумма должна отображать ее как ноль.

Структура таблицы:

 Currency varchar(10), 
     PaymentType(int), 
     amount(decimal) 

Запрос:

Linq Expression:

 var temp = _db.Payments.Select(c => c.PaymentType) .Distinct() 
     .SelectMany(c => _db.Payments.Select(a => a.Currency).Distinct(), 
     (PaymentType, Currency) => new { PaymentType, Currency }).ToList(); 


     var data = from p in temp join c in _db.Payments on new {     
     p.PaymentType, p.Currency } equals new { c.PaymentType, c.Currency } 
     into j1 from j2 in j1.DefaultIfEmpty() group j2 by new { 
     p.PaymentType, p.Currency } into grouped select new { paymenttype = 
     grouped.Key.PaymentType, currency = grouped.Key.Currency, amount = 
     grouped.Sum(t => (decimal?)t.Amount ?? 0) }; 

Но это дает мне ошибку "Ссылка на объект" из-за NULL исключения в заявлении SelectMany объявляя новое.

  t => (decimal?)t.Amount ?? 0 

Может кто-то помочь, где я делаю неправильно.

+0

Мое предположение, что либо p.PaymentType или p.Currency является NULL – Ako

+0

@Ako Да, вы правы. Позвольте мне объяснить u образцом. скажем, валюта доллара США имеет значения с paytype 0,1, но не с 2. Теперь мое требование - мне нужно USD, 2 и сумма суммы как 0. Поэтому я создал надмножество в своем темпе, а затем попытался присоединиться к нему. Итак, теперь для USD, 2 в таблице нет суммы и, следовательно, null. Не знаете, как справиться с этим. – user3182464

ответ

0

Я немного переписал код с некоторыми примерами данных и воспроизвел ошибку, как описано.

var Payments = new [] {new {PaymentType = 0, Currency = "EUR", Amount = 10}, 
           new {PaymentType = 0, Currency = "CHF", Amount = 70}, 
           new {PaymentType = 2, Currency = "CHF", Amount = 80}, 
           new {PaymentType = 1, Currency = "GBP", Amount = 90}, 
           new {PaymentType = 1, Currency = "EUR", Amount = 100}}; 


     var temp = Payments.Select(c => c.PaymentType).Distinct() 
          .SelectMany(c => Payments.Select(a => a.Currency).Distinct(), 
                  (pt, cur) => new { PaymentType = pt, Currency = cur }) 
          .ToList(); 


     var data = from p in temp 
        join c in Payments on new { p.PaymentType, p.Currency } equals new { c.PaymentType, c.Currency } into j1 
        from j2 in j1.DefaultIfEmpty() 
        group j2 by new 
        { 
         p.PaymentType, 
         p.Currency 
        } into grouped 
        select grouped; 

     foreach (var g in data.ToList()) 
     { 

      Console.WriteLine("{0},{1},{2}", g.Key.PaymentType, g.Key.Currency, g.Sum(t => t.Amount)); 
     } 


     Console.ReadLine(); 

Таким образом, проблема заключалась в том, что t.amount не null: t сам имеет значение null. Поэтому все, что вам нужно настроить это:

grouped.Sum(t => t == null ? 0 : t.Amount) 
+0

отлично работает :) – user3182464