2012-11-02 47 views
0

此代碼如何做一個選擇linq-to-sql MAX查詢?

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

生成以下SQL代碼:

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

但是,如果表是空的,我得到的空值不能被分配到非空的變量異常saing。

然後我寫這篇文章的代碼,明確地告訴我需要的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] 

所以這似乎不可思議,尤其是有兩個SELECT秒。有什麼辦法可以繞過這個嗎?

+1

爲什麼你認爲兩個選擇沒有性能差異? – AgentFire

+0

我更全面地回答了這個問題。 – usr

+0

@usr您能否將我們鏈接到答案並向我們顯示數字?這將是最有幫助的。 –

回答

1

SQL可能很複雜,但沒有性能差異。 SQL Server查詢優化器可靠地優化兩個語句到同一個計劃。

真的,刪除冗餘嵌套選擇是一個微不足道的情況。我從來沒有見過這種情況導致計劃差異。

所以這是一個美學問題,而不是一個實際問題。 ORM生成令人費解的代碼,我學會了與它一起生活。