1

私のコントローラーには、データベースからの情報を保持するモデルを作成するメソッドがあります。メソッド内にロジックを作成して、モデルに既にデータが含まれているかどうかを確認する方法はありますか? これSelectCompanyFromDropdown()は、ユーザーが別のページに移動するたびに呼び出されますが、データベース呼び出しを減らすためにチェックしたいと思います。グローバル変数でうまくいくかどうか疑問に思っていますが、グローバルのデバッグで問題が発生する可能性があることはわかっています。

pseudo: 
if(Model != null)
Run Method
return PartialView(new model)
Else
return PartialView(existing model)

コントローラ メソッド: public PartialViewResult SelectCompanyFromDropdown() {

            var coid = Lt.GetThisUsersCoId();
            var model = new CompanyViewModel();
            using (var dc = new CompanyViewModelDbContext())
            {
                var content =
                    (from cr in db.CompanyRelationship
                     //This is grabbing all related companies to the logged in user
                     join c in db.Companies on cr.CoId equals c.CoId
                     where cr.PartnerCoId == coid

                     select new
                     {
                         cr.CoId,
                         c.CompanyName
                     }).Distinct().ToDictionary(cr => cr.CoId, c => c.CompanyName);

                model.Companies = content;

            }
            return PartialView(model);
        }

これはモデルをビューに送信してドロップダウンを作成していますが、ユーザーがページを変更するたびに既存のモデルを参照したいと思います。

4

1 に答える 1

1

データベース呼び出しの結果があまり頻繁に変更されない場合は、それをキャッシュできます。したがって、このタスクを実行するメソッドを作成することから始めます。

private IDictionary<int, string> GetCompanies(int coid)
{
    var result = MemoryCache.Default[coid.ToString()] as IDictionary<int, string>;
    if (result != null)
    {
        // we already have cached results => no need to perform expensive database calls
        // we can return directly the cached results;
        return result;
    }

    // there's nothing in the cache => we need to make the DB call
    // and cache the results for subsequent use
    using (var dc = new CompanyViewModelDbContext())
    {
        result =
            (from cr in db.CompanyRelationship
             //This is grabbing all related companies to the logged in user
             join c in db.Companies on cr.CoId equals c.CoId
             where cr.PartnerCoId == coid
             select new
             {
                 cr.CoId,
                 c.CompanyName
             }).Distinct().ToDictionary(cr => cr.CoId, c => c.CompanyName);
    }

    var policy = new CacheItemPolicy
    {
        // Cache the results of the Db query for 24 hours
        AbsoluteExpiration = DateTimeOffset.Now.AddHours(24),
        Priority = CacheItemPriority.NotRemovable,
    };

    MemoryCache.Default.Set(coid.ToString(), result, policy);

    return result;
}

コントローラー アクションに残っているのは、このメソッドを呼び出してビュー モデルにデータを入力することだけです。

var model = new CompanyViewModel();
var coid = Lt.GetThisUsersCoId();
model.Companies = GetCompanies(coid);
return PartialView(model);

また、ビューモデルについて誤解しているようです。あなたの EF コンテキストは と呼ばれているようCompanyViewModelDbContextです。ビュー モデルは、ビュー ロジックの要件を満たすように特別に設計されたクラスです。データ層 (これは、EF があなたの場合に果たす役割です) は、このビュー ロジックの知識がまったくないはずです。ドメイン モデルをビュー モデルに関連付けないでください。

于 2013-10-04T22:00:28.220 に答える