此代码
int maxTrackId = dataContext.TicketTracks.Max(T => T.TrackId);
生成以下SQL
代码:
SELECT MAX([t0].[TrackId]) AS [value]
FROM [dbo].[TicketTracks] AS [t0]
但是如果表是空的,我得到一个例外,即可以将可空值分配给不可为空的变量。
然后我编写这段代码,明确告诉SQL提供程序我需要maximum或null:
int? maxTrackId = dataContext.TicketTracks.Max(T => (int?)T.TrackId);
它在非可空SQL列上工作正常,可以返回null
或数字。但生成的SQL
代码有点奇怪:
SELECT MAX([t1].[value]) AS [value]
FROM (
SELECT [t0].[TrackId] AS [value]
FROM [dbo].[TicketTracks] AS [t0]
) AS [t1]
所以看起来很奇怪,特别是有两个SELECT
。有没有办法绕过这个?
答案 0 :(得分:1)
SQL可能会有问题,但没有性能差异。 SQL Server查询优化器可以可靠地优化同一计划的两个语句。
实际上,删除冗余嵌套选择是一件非常简单的事情。我从未见过这导致计划差异。
所以这是一个美学问题,而不是一个实际问题。 ORM生成了复杂的代码,我学会了使用它。