我有一个Linq to SQL查询,返回一些余额非零的订单(实际上,这个查询有一点复杂,但为了简单起见,我省略了一些细节)。这个查询还应该返回没有CardItems的订单(两个子查询在T-SQL中都返回NULL,比较两个NULL会得到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 转换为 T-SQL 查询语句时使用 COALESCE 运算符,但由于其中的子查询,它比替换为 ISNULL 的完全相同的 T-SQL 查询慢十倍。在这种情况下是否有可能生成 ISNULL 呢?
COALESCE
会给他带来问题,只是他说听说这样做不好。无论哪种情况,他都不应该像Oblivion2000的答案所示那样做任何事情,因此这是一个无意义的论点。 - Guvante