0

这段代码

int maxTrackId = dataContext.TicketTracks.Max(T => T.TrackId);

生成以下SQL代码:

SELECT MAX([t0].[TrackId]) AS [value]
FROM [dbo].[TicketTracks] AS [t0]

但是如果表是空的,我会得到一个异常,即不能将可空值分配给不可为空的变量。

然后我编写这段代码,明确告诉 SQL 提供程序我需要最大值或空值:

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]

所以这看起来很奇怪,尤其是有两个SELECTs。有什么办法可以规避这种情况吗?

4

1 回答 1

1

SQL 可能很复杂,但没有性能差异。SQL Server 查询优化器可靠地将两个语句优化到同一个计划。

确实,删除多余的嵌套选择是一件小事。我从未见过这会导致计划差异。

所以这是一个美学问题,而不是一个实际问题。ORM 生成复杂的代码,我学会了接受它。

于 2012-11-02T13:26:43.050 回答