2017-12-31 56 views
-1

管理ダッシュボードを持ち、のすべてのデータをまとめたのWebアプリケーションを作成しています。1つのコントローラーアクションで多くのデータベースラウンドトリップを実行することはOKですか

ここではMSSqlが使用されています。

1回のコールで異なるテーブルからこれらのデータをすべて取得する方法はありますか?

私は私のリポジトリデザインにも関心があります。 IQueryableを返すのは、メモリ内のすべてのデータをIEnumerableとして取得し、拡張メソッドを使用してより多くのフィルタリング/ページを実行するのが効率的ではないためです。

私のリポジトリを作る良い方法はありますか?ここで

は(同様にコントローラのアクションすることができます)私の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内のすべてのデータを返す1つのメソッドが導入されています。 EFを使用して、最小限の往復回数ですべてのデータを取得します。パフォーマンステストを行い、パフォーマンスがニーズに合っていれば、完了です。そうでない場合は、ストアード・プロシージャーに作業をプッシュし、パフォーマンス・テストを再度実行してください。十分に速くない場合は、実行計画を分析してボトルネックを見つけます。ページングを使用する。時期尚早の最適化を行わないでください。 – CodingYoshi

+0

非常に賢明なアプローチで、私は実際に私のリポジトリにページングを追加しようとしましたが、それは悪いオプションであることが判明しましたページングの前にフィルタリングする必要があります...だから基本的にページングは​​IQueryable を拡張する必要があります。 –

答えて

1

あなたはデータが別の場所から来ているように、複数の呼び出しを行う必要がある場合1つのデータベースクエリで要求できない場合、これは問題ではありません。理想的な場所で最適化してキャッシュします。

+0

"最適化とキャッシュ"方法 –

+0

問合せを確認し、可能な場合は単一の問合せを含めることができます。また、特定の期間、たとえばセッション中に結果を格納してキャッシュして、データベースへのラウンドトリップを減らすことができます。利用できるキャッシュテクニックを調べる必要があります。 –

+0

セッション!=キャッシュ。このようなセッションはおすすめしないでください。 ASP.NET Coreには実際のキャッシュインフラストラクチャがありますので、それを使用してください。 –

1

伝統的に、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

1回の呼び出しでこのような操作を行う別のリポジトリを追加するのがいいでしょうか? –

+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 –

関連する問題