2016-08-09 21 views
1

私は単純なビューモデルを持っていますが、それ自体が設定されていますが、ウェブページには多くの選択リストが含まれています。リスト。ビューモデルからのSQL Serverデータベースへの並列呼び出し

データベース・コールを非同期または並列で実行することは可能ですか?あなたが見ることができるように、_list3は_list2を待っていると_list2が_list1を待っていると、これはリクエストをたくさん遅らせることができる

// controller 
public ActionResult Index() 
{ 
    model = new SampleViewModel();  
    model.Populate(database); 
    return View(model); 
} 

// view model 
public class SampleViewModel 
{ 
    public SampleViewModel(DbContext db) 
    { 
     _list1 = context.Db.SqlQuery<SelectList1>("SELECT Id, Value FROM dbo.Table1").ToList(); 
     _list2 = context.Db.SqlQuery<SelectList2>("SELECT Id, Value FROM dbo.Table2").ToList(); 
     _list3 = context.Db.SqlQuery<SelectList3>("SELECT Id, Value FROM dbo.Table3").ToList(); 
     _list4 = context.Db.SqlQuery<SelectList4>("SELECT Id, Value FROM dbo.Table4").ToList(); 
     _list5 = context.Db.SqlQuery<SelectList5>("SELECT Id, Value FROM dbo.Table5").ToList(); 
    } 

    private readonly List<SelectList1> _list1; 
     public int SelectedList1Id { get; set; } 
     public IEnumerable<SelectListItem> List1 { get { return new SelectList(_list1, "Id", "Value");} } 

    -//- _list2 
    -//- _list3 
    -//- _list4 
    -//- _list5 
} 

私はこの種のコードを持っています。実際のシナリオでは、これらの選択リストは互いに関連しており、モデルには選択されたIDに関する情報が含まれているため、モデルの検証が失敗した場合などの選択リストを再構築できます。

いくつかの非同期待機アプローチを使用できますか?この場合、SQL Server 2008に対して私は役に立ちますか?

+0

(モデルビューコントローラー - 「ビューモデル」ではない、モデルです) – Will

答えて

1

タスクパラレルライブラリParalle.Invokeを使用すると、多くのタスクを並行して実行できます。

Parallel.Invoke(() =>{ 
    // Execute some code here  
},() => 
{ 
    // Execute some other code here 
}); 

私は個人的に私の見解モデルに、具体的なDbContextオブジェクトを渡すことはありません。ビューモデルは単純なPOCOでなければなりません。それはあなたのデータアクセス技術の知識を持っているべきではありません。私の個人的な好みはデータアクセスコードを私のビューモデルから分離しておくことです。だから私は決してあなたのような具体的なオブジェクトを持つビューモデルのコンストラクタのデータベースから値を読み取ることはありません。

あなたがGETアクションでこの

public class CreateViewModel 
{ 
    public List<SelectListItem> States {set;get;} 
    public List<SelectListItem> UserTypes {set;get;} 
} 

のような単純POCOビューモデルを持っていると仮定すると、あなたは2つのプロパティデータをロードするためにParallel.Invokeを使用することができます。

var vm = new CreateViewModel(); 
Parallel.Invoke(() =>{ 
    vm.States = db.States.Select(s=>new SelectListItem { Value=s.Id.ToString(), 
                 Text=s.Name }).ToList(); 
},() => 
{ 
    vm.UserTypes= db.UserTypes.Select(s=>new SelectListItem { Value=s.Id.ToString(), 
                   Text=s.Name }).ToList(); 
}); 
return View(vm); 

キャッシュ

これらは、あなたのドロップダウンのために頻繁にアクセスする項目であれば、私はあなたがこのデータをキャッシュする代わりに、DBテーブルを毎回照会示唆しています。デフォルトのMemoryCacheを使用することを検討することができます。

+0

ありがとう、私はそれを試してくれます! :-)理由は、私はビューティーモデルそのものを埋める理由は、私は脂肪コントローラを持っていないか、別のサービス層を追加したい、私はまだ経験していないので、多分次のプロジェクトで私はいくつかの異なるaproachを試してみます – Muflix

+0

また、この問題は管理者のためのバックエンドにあるので、キャッシュは、それが呼び出すアイデアは、データベーステーブルの最後の更新時間を追跡し、それが変更された場合、キャッシュをリセットすることです。私はまたそれについて考えます – Muflix

関連する問題