C# 如何进行一次select linq到sql MAX查询?

C# 如何进行一次select linq到sql MAX查询?,c#,sql,sql-server,linq-to-sql,max,C#,Sql,Sql Server,Linq To Sql,Max,此代码 int maxTrackId = dataContext.TicketTracks.Max(T => T.TrackId); 生成以下SQL代码: 选择MAX([t0].[TrackId])作为[value] 从[dbo].[TicketTracks]到[t0] 但如果表是空的,我会得到一个异常,即不能将可为null的值分配给不可为null的变量 然后我编写这段代码,明确地告诉SQL提供程序我需要最大值或null: int? maxTrackId = dataContext.T

此代码

int maxTrackId = dataContext.TicketTracks.Max(T => T.TrackId);
生成以下
SQL
代码:

选择MAX([t0].[TrackId])作为[value]
从[dbo].[TicketTracks]到[t0]
但如果表是空的,我会得到一个异常,即不能将可为null的值分配给不可为null的变量

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

int? maxTrackId = dataContext.TicketTracks.Max(T => (int?)T.TrackId);
它在不可为null的SQL列上运行良好,返回
null
或数字。但是生成的
SQL
代码有点奇怪:

选择MAX([t1].[value])作为[value]
从(
选择[t0].[TrackId]作为[value]
从[dbo].[TicketTracks]到[t0]
)AS[t1]

所以这看起来很奇怪,特别是有两个
SELECT
s。有什么办法可以避免这种情况吗?

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

实际上,删除冗余的嵌套select是一个简单的例子。我从未见过这会导致计划上的差异


因此,这是一个美学问题,而不是实际问题。ORM生成复杂的代码,我学会了使用它。

为什么你认为两次选择没有性能上的差异?我在一个更彻底的答案中回答了这个问题。@usr你能将我们链接到答案并给我们显示数字吗?“那会很有帮助的。”杰夫布里奇曼回答如下。只要看看执行计划就可以了。有什么原因让你期望有所不同吗?这种差异怎么可能在执行计划中表现出来呢?老实说,我想不出一个办法。也许是一个空的计算标量?