管理ダッシュボードを持ち、のすべてのデータをまとめたの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;
}
}
リポジトリには、指定されたページのIEnumerable内のすべてのデータを返す1つのメソッドが導入されています。 EFを使用して、最小限の往復回数ですべてのデータを取得します。パフォーマンステストを行い、パフォーマンスがニーズに合っていれば、完了です。そうでない場合は、ストアード・プロシージャーに作業をプッシュし、パフォーマンス・テストを再度実行してください。十分に速くない場合は、実行計画を分析してボトルネックを見つけます。ページングを使用する。時期尚早の最適化を行わないでください。 – CodingYoshi
非常に賢明なアプローチで、私は実際に私のリポジトリにページングを追加しようとしましたが、それは悪いオプションであることが判明しましたページングの前にフィルタリングする必要があります...だから基本的にページングはIQueryableを拡張する必要があります。 –