2017-12-31 271 views
-1

관리자 대시 보드가 있고 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; 
    } 
} 
+0

저장소에 지정된 페이지에 대한 IEnumerable의 모든 데이터를 반환하는 하나의 메소드를 소개합니다. 최소한의 왕복 횟수로 모든 데이터를 얻으려면 EF를 사용하십시오. 성능 테스트를 수행하고 성능이 사용자의 요구에 충분하면 작업이 완료된 것입니다. 그렇지 않은 경우 저장 프로 시저로 작업을 밀어 넣고 성능 테스트를 다시 수행하십시오. 빠르지 않으면 실행 계획을 분석하고 병 목을 찾으십시오. 페이징을 사용하십시오. 조숙 한 최적화를하지 마십시오. – CodingYoshi

+0

매우 현명한 접근 방식으로, 실제로 저장소에서 페이징을 추가하려고 시도했지만 페이징 전에 필터링해야하는 나쁜 옵션 인 것으로 나타났습니다 ... 기본적으로 페이징은 IQueryable 을 확장해야합니다. –

답변

1

단일 데이터베이스 쿼리에서 요청할 수 없으면 문제가되지 않습니다. 그것이 의미있는 곳에서 최적화하고 캐시하십시오.

+0

"최적화 및 캐시"방법? –

+0

쿼리를 검토하고 가능한 경우 단일 쿼리를 포함 할 수 있으며 데이터베이스에 대한 왕복 이동을 줄이기 위해 특정 시간 동안 결과를 저장 (예 : 세션)하여 캐시 할 수 있습니다. 사용할 수있는 캐싱 기술을 찾아야합니다. –

+0

세션! = 캐시. 이런 일에 대해서는 세션을 권유하지 마십시오. ASP.NET 코어에는 사용할 수있는 실제 캐싱 인프라가 있으므로이를 사용하십시오. –

1

왕복 여행에서 많은 양의 데이터를 원한다면 SQL Server에 대한 대답은 저장 프로 시저입니다. 엔티티 프레임 워크에는 저장 프로 시저에 직접 액세스하는 방법이 있지만 형식을 유지하면 여러 쿼리에서 데이터를 가져 오는 저장 프로 시저의 뷰가 데이터베이스에 구축 될 수 있으므로 각 쿼리가 서버 측에서 실행되고 결과 한 번에 뒤로 당겨집니다.

는 직접 저장 프로 시저를 액세스 :

http://www.entityframeworktutorial.net/stored-procedure-in-entity-framework.aspx

How to call Stored Procedure in Entity Framework 6 (Code-First)?

이 그것을 다시 하나 개의 테이블에서 제공하므로 저장 프로 시저가 데이터를 조작해야합니다. Entity Framework는 실제로이 작업을 수행하는 최선의 방법은 아니지만 실제 목적은 자동 완성을 추가하는 동안 WHERE 절없이 UPDATE 및 DELETE와 같은 루키 오류를 수행하는 것을 더 어렵게 만드는 것입니다.

+0

한 번의 호출로 이러한 작업을 수행하는 다른 저장소를 추가하는 것과 같습니다. –

+0

기본적으로. 그러나 MS SQL Server를 사용하는 경우 설치할 항목이 없습니다. Management Studio를 열고보기 또는 프로 시저를 만들 수 있습니다. – NeedsAnswers

2

EF (SQLServer, MySql, Oracle 등)와 함께 사용하는 데이터베이스 유형은 언급하지 않았습니다.

SQL을 사용하면 관계형 데이터베이스에서 집계 된 데이터를 검색하는 것이 매우 쉽습니다. 보기를 정의하고 다음과 같은 하위 선택을 사용할 수 있습니다. https://www.essentialsql.com/get-ready-to-learn-sql-server-19-introduction-to-sub-queries/

+0

MSSql을 사용하고 있습니다 ... 내 질문에, 감사를 추가했습니다! –

+0

죄송합니다. 나는 그것을 놓쳐 버렸음에 틀림 없다. – LosWochos

+0

답을 읽은 후에 제 질문을 편집합니다. D –