【发布时间】:2012-06-12 11:25:25
【问题描述】:
我有一个 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 ?
【问题讨论】:
-
@PreetSangha,如果您知道问题出在哪里,那么以正确的方式编写代码有什么“错误”?我认为这是一种错误的方法,即使您知道问题所在,但您却什么也不做……如果您愿意生成比实际速度慢 10 倍的代码,那么调用优化是很有趣的”错了”...
-
@walther:许多其他人都说过为什么过早的优化是邪恶的。 OP:查询的整体运行时间是否受到显着影响?这应该指导这对您是否重要,而不是您以前与运营商的经验。
-
@Guvante 和许多其他人都说过,为什么愿意用“我以后可能会修复它”来编写一个糟糕的代码是一种糟糕的方法......如果你知道你的代码很糟糕,不要'不要等到它成为一个问题......只是我的意见,也许你想稍后解决问题:)
-
@walther:除非存在实际的性能问题,否则没有什么可修复的。而且我没有看到任何实际的性能测试表明
COALESCE导致了他的问题,只是他说他听说这样做很糟糕。在任何一种情况下,他都不应该做那样的事情(正如 Oblivion2000 的回答所示),所以这是一个有争议的问题。 -
伙计们,OP 已经清楚地表明 ISNULL 在他的情况下更可取。要么为他提供解决方法,要么回答问题!不用再争论了。
标签: c# linq tsql linq-to-sql