0

このコード

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

SQL次のコードを生成します。

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

しかし、テーブルが空の場合、null許容値をnull許容でない変数に割り当てることができないという例外が発生しました。

次に、このコードを記述し、SQLプロバイダーに最大値またはnullのいずれかが必要であることを明示的に通知します。

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

そして、null許容でないSQL列で正常に機能し、nullまたは数値のいずれかを返します。しかし、SQL生成されたコードはちょっと奇妙です:

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

したがって、特に2つの場合は奇妙に見えSELECTます。これを回避する方法はありますか?

4

1 に答える 1

1

SQL は複雑になる可能性がありますが、パフォーマンスの違いはありません。SQL Server クエリ オプティマイザーは、両方のステートメントを確実に同じプランに最適化します。

実際、冗長なネストされた選択を削除するのは些細なケースです。これが計画の違いを引き起こすのを見たことがありません。

したがって、これは実用的な問題ではなく、審美的な問題です。ORM は複雑なコードを生成し、私はそれと一緒に暮らすことを学びました。

于 2012-11-02T13:26:43.050 に答える