2016-08-09 4 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

(psst, 모델보기 컨트롤러입니다.이 모델은 "보기 모델"이 아닙니다.) – 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보기 모델은 한 가정, 당신은이 속성 데이터를로드 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

감사합니다. 시도해 보겠습니다. :-) 뷰 모델 자체를 채우는 이유는 뚱뚱한 컨트롤러를 가지고 있거나 다른 서비스 레이어를 추가하고 싶지 않기 때문입니다. 아직 익숙하지 않았기 때문에 다음 프로젝트에서 다른 프로젝트를 시도 할 것입니다 – Muflix

+0

또한 사용하고 싶지 않습니다. 캐시는이 문제가 관리자를위한 백엔드이기 때문에 호출하지만 데이터베이스 테이블의 마지막 업데이트 시간을 추적하여 캐시가 재설정되면 캐시를 재설정하는 것이 좋습니다. 또한 생각할 것입니다. – Muflix