2016-10-11 5 views
1

テーブルが空の場合、私は3つの性能がすべて似ていると思います。しかし、テーブルに何百万ものレコードがある場合、パフォーマンスの影響はどうなるでしょうか。テーブルが空の場合のハンドルMAX()のオプションを修正しますか?

1。元のクエリは影響を受けませんが、2つの分離されたdbのコンサルトを作成する必要があるため、好きではありません。

2。なぜなら、空のテーブルがインデックスを使用して最大値を見つける代わりにすべての行を持っていなければならないからです。

3。これはエラーを発生させる代わりにnullを返すべきです。

long? LastInsertedID; 

try 
{ 
    LastInsertedID = db.myTable.Any() ? 
         db.myTable.Max(p => p.id) 
        : 0; 

    LastInsertedID = db.myTable.Select(p => p.id) 
          .DefaultIfEmpty(0) 
          .Max(); 

    LastInsertedID = db.myTable.Max(p => p.id); -- cause Exception 
} 

例外:

{ "マテリア値がnullであるため、値型へのキャスト『System.Int64』は失敗した結果の型のジェネリックパラメータまたはNULL可能タイプを使用する必要があり、クエリのどちらか。 "}

+0

id' 'の種類は何ですか?私はそれは "シーケンスはアイテムが含まれていない例外"を投げるだろうと思った –

+0

は、null可能な長整数ではありませんが、問題はdbが空の場合です。 –

答えて

3

IMO作業中の3番目のオプションが最適です。データベースクエリは、集合が空の場合、集合関数の大半(COUNTを除く)に対してnullを返します。例外メッセージによる提案も同様です。

必要なのは、対応するNULL可能な型にキャストを含めることです。

LastInsertedID = db.myTable.Max(p => (long?)p.id); 
+1

Dohのようなことをすることができます。私はこの同じ提案で重複した質問を試みることを誓い、たとえコンパイルしなかったとしても、それはC#とは違っていたからです。今完璧:/。 TY –

1

2番目の方が優れています。複数のデータベースヒット(一般的にはヒット)を避けると、より明確になり、失敗することはありません。

+0

しかし、 'SELECT'はdbからクライアントにすべてのレコードを持ち込み、ローカルで' MAX'を計算しませんでしたか? –

+0

そうは思いません。できるだけ実際のSQLに変換することになっています。あなたのプロバイダとその実装によって異なる場合があります。 – robhol

+0

SQLプロファイラを実行し、生成されたクエリを確認してください。 – Javier

関連する問題