관리자 대시 보드가 있고 db에있는 모든 데이터 요약 을 가진 웹 응용 프로그램을 작성하고 있습니다.하나의 컨트롤러 동작에서 많은 데이터베이스 왕복을 할 수 있습니까?
여기서 MSSql이 사용되고 있습니다.
한 번의 호출로 서로 다른 테이블의 데이터를 모두 얻을 수있는 방법이 있습니까?
저는 또한 저장소 설계에 관심이 있습니다. 나는 모든 데이터를 IEnumerable로 메모리에 저장하고 확장 메서드를 사용하여 더 많은 필터링/페이징을 수행하는 것이 효율적이지 않기 때문에 IQueryable을 반환합니다.
내 저장소를 만드는 더 좋은 방법이 있습니까? 여기
은 (뿐만 아니라 컨트롤러 액션 될 수 있습니다) 내 ViewComponent 작업입니다 :public async Task<IViewComponentResult> InvokeAsync()
{
var agents = _repository.AgentData.GetAll();
var applications = _repository.ApplicationData.GetAll();
var paymentRequests = _repository.PaymentRequestData.GetAll();
var universityCommissionCalcuator = new CommissionUniversityCalculator(0);
var commissionCalcuator = new CommissionReferralCalculator(universityCommissionCalcuator);
var commission = await _repository.AgentData.GetTotalCommissions(applications, commissionCalcuator);
var result = AdminSummaryMapper.ToViewModel(agents, applications, paymentRequests, commission);
return View(result);
}
AdminSummaryMapper : 데이터가 다른 장소에서오고 당신이 여러 통화를해야하는 경우
public static class AdminSummaryMapper
{
public static AdminSummaryViewModel ToViewModel(IQueryable<Agent> agents,
IQueryable<Application> applications,
IQueryable<PaymentRequest> paymentRequests,
Commission commission)
{
var result = new AdminSummaryViewModel()
{
TotalStudents = applications.Count(),
ConfirmedStudents = applications.Count(app => app.ApplicationStatus == ApplicationStatus.Confirmed),
UnderEvaluationStudents = applications.Count(app => app.ApplicationStatus == ApplicationStatus.UnderEvaluation),
TotalAgents = agents.Count(),
PaymentRequests = paymentRequests.Count(),
TotalCommission = commission.TotalComission,
NetCommission = commission.NetComission,
};
return result;
}
}
저장소에 지정된 페이지에 대한 IEnumerable의 모든 데이터를 반환하는 하나의 메소드를 소개합니다. 최소한의 왕복 횟수로 모든 데이터를 얻으려면 EF를 사용하십시오. 성능 테스트를 수행하고 성능이 사용자의 요구에 충분하면 작업이 완료된 것입니다. 그렇지 않은 경우 저장 프로 시저로 작업을 밀어 넣고 성능 테스트를 다시 수행하십시오. 빠르지 않으면 실행 계획을 분석하고 병 목을 찾으십시오. 페이징을 사용하십시오. 조숙 한 최적화를하지 마십시오. – CodingYoshi
매우 현명한 접근 방식으로, 실제로 저장소에서 페이징을 추가하려고 시도했지만 페이징 전에 필터링해야하는 나쁜 옵션 인 것으로 나타났습니다 ... 기본적으로 페이징은 IQueryable을 확장해야합니다. –