0

Nullable<T>Linq2Sql を使用してストアド プロシージャから返されたフィールドを処理するためのベスト プラクティス (メモリと CPU 時間を考慮) に関する提案を探しています。

次のシナリオと制限を考慮してください。

  1. コードのどこでも fieldValue.HasValue チェックを使用しないようにしたい。Nullable<T>したがって、すべてを通常のプロパティ (特に DateTime、Double、Int)に置き換える必要があります。
  2. Nullable 型の ~20 フィールドを持つ ~100 万オブジェクトを読み取ることを期待しています。
  3. メモリと CPU の使用率は重要な考慮事項です。
  4. 要件は、(DataRow ではなく) オブジェクトのストアド プロシージャから結果を取得することであり、したがって Linq2Sql を使用します。

同様の状況に対処することについて、あなたの意見や経験を共有してください。

ご関心をお寄せいただきありがとうございます。

4

3 に答える 3

2

最善の解決策:

  • SQL が NULL 値を返すことを許可しないでください。

  • これを行う最も簡単な方法は、列自体を null にしないことですが、それが不可能な場合は、データを返すために使用しているクエリで ISNULL(field, defaultvalue) を実行できます。

次善の策:

  • LINQToSQL オブジェクトの get 呼び出しを上書きして、オブジェクトに HasValue があるかどうかを確認し、そうでない場合default(type)はフィールドの値に設定します。

すべての値をチェックしない方法はありません。

于 2012-01-10T15:59:10.030 に答える
1

次のような拡張メソッドを記述できます。

public static string SafeGetString(this SqlDataReader _Reader, int _ColIndex)
{
    if (_Reader.IsDBNull(_ColIndex))
        return null; //Default value
    else
        return _Reader.GetString(_ColIndex);
}

使用される型ごとに (実際にはそれほど多くはありません)、nullデータを null 非許容型に挿入する場合を除いて、既定値を別の値に設定します。

于 2012-01-10T15:46:40.633 に答える
0

筋金入りのオプションは、ソースで値を結合することです。null がデータ リーダーから離れていることを保証します。

しかし、パフォーマンスが大きな懸念事項であるように思われるため、コードの健全性を損なう (過剰な最適化) またはランタイムの健全性を損なう (メモリや CPU の悪用) 前に、さまざまなオプションを測定して十分な情報に基づいた決定を下すことをお勧めします。

補足として、データベースから何百万行もフェッチすると、どこかにかなりの影響が生じることは間違いありません。通常、いつどこで痛みが少なくなるかを決める必要があります。

于 2012-01-10T16:02:14.680 に答える