0

2 つの GridView があります。GetGeneralDiagnosisすべての診断のリストを返すメソッドがあります:

コード 診断
F50 摂食障害
F51 非有機的睡眠障害

GetSpecificDiagnosisより具体的なリストを返すメソッド:

コード 診断
F50.0 神経性無食欲症
F50.1 非定型神経性無食欲症
F51.0 非器質性不眠症
F51.1 非器性性過眠症

これで、最初の GridView の一般的な診断に従って、SPECIFIC DIAGNOSIS を 2 番目の GridView にバインドするメソッドができました。

protected void gvGeneralDiagnosis_SelectedIndexChanged(object sender, EventArgs e)
{
    string generalDiagnosis = gvGeneralDiagnosis.DataKeys[gvGeneralDiagnosis.SelectedIndex].Values["ICD10Code"].ToString(); 
    var ICD10 = Visit.GetSpecificDiagnosis();   // here I'm getting data from database
    gvSpecificDiagnosis.DataSource = ICD10.Where(i => i.ICD10Code.Contains(generalDiagnosis)).Select(i => new { i.ICD10Name, i.ICD10Code });
    gvSpecificDiagnosis.DataBind();
}

選択したインデックスが変更されるたびにデータベースに接続したくありません。

リストを一度だけ取得するにはどうすればよいvar ICD10 = Visit.GetSpecificDiagnosis()ですか? グローバル変数は非常に悪い考えだと聞きましたが、どうすれば別の方法でそれを行うことができますか?

4

3 に答える 3

1

Visit返されたデータをクラスにキャッシュさせることができます。

GetSpecificDiagnosis呼び出されると、このデータがデータベースから既に取得されているかどうかを確認し、取得されている場合はそれを返します。そうでない場合は、データベースから取得してキャッシュに保存します。

注意すべきことの 1 つは、このデータが静的 (つまり、アプリケーションの存続期間を通じて変更されない) か、動的かということです。前者の場合は特別な処理を行う必要はありませんが、後者の場合は、データベース内の情報が変更された場合にキャッシュを無効にする必要があります。

ASP.NET でキャッシュを開始する方法については、こちらをご覧になることをお勧めします。

于 2012-07-28T16:02:01.237 に答える
1

プライベート メンバー変数を使用できます。これは、それを含むクラスが存在する限り「存続」します。プロパティでラップしてアクセスし、必要に応じてデータベースから自動的に読み取ります。

private TypeOfICD10 _icd10;
private TypeOfICD10 ICD10
{
    get
    {
        if (_icd10 == null) { // Get from database.
            _icd10 = Visit.GetSpecificDiagnosis();   
        }
        return _icd10;
    }
}

これで、このように使用でき、最初の呼び出しでのみデータベースから読み取られます

protected void gvGeneralDiagnosis_SelectedIndexChanged(object sender, EventArgs e)
{
    string generalDiagnosis = gvGeneralDiagnosis.DataKeys[gvGeneralDiagnosis.SelectedIndex].Values["ICD10Name"].ToString();
    gvSpecificDiagnosis.DataSource = ICD10
        .Where(i => i.ICD10Code.Contains(generalDiagnosis))
        .Select(i => new { i.ICD10Name, i.ICD10Code });
    gvSpecificDiagnosis.DataBind();
}
于 2012-07-28T16:08:30.670 に答える
0

私はあなたの質問からVisistクラスについてあまり知りませんが、キャッシュされたオブジェクトを使用するこの方法でICD10をキャッシュしないのはなぜですか。キャッシュキーICD10の値がnullの場合にのみデータベース呼び出しが行われます

例 :

if(Cache["ICD10"] == null)
{
 var ICD10 = Visit.GetSpecificDiagnosis();
 Cache["ICD10"] = ICD10;
}
else
{
var ICD10 =  Cache["ICD10"];
}
于 2012-07-28T16:13:22.810 に答える