zu machen Ich schreibe eine Web-App, die ein Admin-Dashboard hat und eine Zusammenfassung aller Daten in der db hat.Ist es in Ordnung, viele Datenbank-Roundtrips in einer Controller-Aktion
MSSql wird hier verwendet.
Gibt es eine Möglichkeit, alle diese Daten aus verschiedenen Tabellen in einer Runde zu erhalten?
Ich bin auch besorgt über meine Repository-Design. Ich gebe ein IQueryable zurück, da es auf keinen Fall effizient sein wird, alle Daten als IEnumerable in den Speicher zu bekommen und mehr Filterung/Paginierung in der Mitte mit Erweiterungsmethoden durchzuführen.
Gibt es eine bessere Möglichkeit, mein Repository zu erstellen?
Hier ist meine ViewComponent Aktion (die auch eine Controller-Aktion sein kann):
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;
}
}
Stellen Sie in Ihrem Repository eine Methode ein, die alle Daten in IEnumerable für die angegebene Seite zurückgibt. Verwenden Sie EF, um alle Daten in der geringsten Anzahl von Rundreisen zu erhalten. Machen Sie einen Leistungstest und wenn die Leistung für Ihre Bedürfnisse gut genug ist, sind Sie fertig. Wenn nicht, schieben Sie die Arbeit auf eine gespeicherte Prozedur und führen Sie die Leistung erneut aus. Wenn nicht schnell genug, analysieren Sie den Ausführungsplan und finden Sie den Flaschenhals. Verwenden Sie Paging. Tun Sie keine vorzeitige Optimierung. – CodingYoshi
Sehr weise Ansatz, ich habe tatsächlich versucht, Paging in mein Repository, aber es erwies sich als eine schlechte Option, denn ich brauche Filterung vor dem Paging ... also im Grunde sollte Paging eine IQueryable erweitern. –