LINQ SUM Nullable - PullRequest
       4

LINQ SUM Nullable

0 голосов
/ 22 сентября 2018

У меня есть простой запрос linq

(From a In db.payments Group Join b In db.interestcharges On  a.pid Equals b.pid Into totalinterest = Group, TotalInterestReceived = Sum(b.interest)) select a, TotalInterestReceived).toList()

b.interest - это десятичный тип в БД.

Броски

"The cast to value type 'System.Decimal' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type."

Это потому, что InterestCharges таблицаможет не иметь каких-либо записей о процентах по pid.

Я пробовал sum(if(b.interest=nothing,0,b.interest), но LINQ переводит его на if(b.interest=0, 0, b.interest), следовательно, он никогда не проверяет нулевое значение.Ничто другое, кажется, не работает вместо ничего.Я пытался vbNull, isDBNull(), но безуспешно.запрос работает нормально, когда сумма не равна нулю.defaultifempty(0) может работать, но не уверен, как использовать его в этом сценарии.Есть указатели?

1 Ответ

0 голосов
/ 23 сентября 2018

Оператор GROUP JOIN означает, что вы пытаетесь выполнить LEFT OUTER JOIN.Вот почему вы получаете NULL проблему.Используя JOIN для INNER JOIN, вы не будете сталкиваться с этим, но это также означает, что вы будете видеть только те элементы, которые имеют интересующие вас значения.

(FROM a in db.Payments 
Join b in db.InterestCharges ON a.pid Equals b.Pid 
SELECT a, TotalInterestReceived = SUM(b.Interest) 
).toList()

Можно создать дополнительный выбор, который может получить значения, на которые вы надеетесь.Цель состоит в том, чтобы вы получили все платежи, а затем в основном добавили процентные платежи (или 0, если таковых нет).

(From a In db.Payments 
Select a 
, TotalInterestRecieved = (From b in db.InterestCharges 
                           Where b.pid = a.pid
                           select b.Interest).DefaultIfEmpty(0).Sum() 
).ToList

РЕДАКТИРОВАТЬ:

Другой вариант будет полностью обойти EF.Создайте представление в базе данных и запросите это представление напрямую, а не пытайтесь получить доступ к базовым данным через LINQ.

Большинство других предложений, которые у меня были бы, включали бы повторение первоначального списка «Платежей» и заполнение значений по мере необходимости.Что подходит для небольшого количества «Платежей», но это решение O (n).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...