У меня есть запрос linq to sql, который возвращает некоторые заказы с ненулевым балансом (на самом деле запрос немного сложнее, но для простоты я пропустил некоторые подробности). Этот запрос также должен возвращать заказы без CardItems (оба подзапроса возвращают NULL в T-SQL, а сравнение двух NULLS дает FALSE, поэтому я конвертирую значения результатов NULL подзапросов в 0 для сравнения).
var q = (from o in db.Orders
where db.Cards(p =>
p.OrderId == o.Id
&& p.Sum + (db.CardItems.Where(i => i.IncomeId == p.Id)
.Sum(i => (double?)i.Amount) ?? 0)
!= (db.CardItems.Where(i => i.DeductId == p.Id)
.Sum(i => (double?)i.Amount) ?? 0)
).Any()
select o);
Проблема, что преобразование выражения Sum (i = > (double?) i.Amount)?? 0 производят COALESCE, что в десять раз медленнее, чем точно такой же запрос T-SQL с заменой COALESCE на ISNULL из-за подзапроса в нем. Есть ли возможность генерировать ISNULL в этой ситуации?