我有一个 linq to sql 查询,它返回一些余额非零的订单(实际上,查询有点复杂,但为简单起见,我省略了一些细节)。这个查询也应该返回没有 CardItems 的订单(两个子查询在 T-SQL 中都返回 NULL,比较两个 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 ?