【发布时间】:2018-01-01 00:21:26
【问题描述】:
我正在编写一个网络应用程序,它有一个管理仪表板,并且有一个数据库中所有数据的摘要。
这里正在使用 MSSql。
有没有办法在一轮调用中从不同的表中获取所有这些数据?
我还担心我的存储库设计。我返回一个 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 中的所有数据。使用 EF 以最少的往返次数获取所有数据。进行性能测试,如果性能足以满足您的需求,那么您就完成了。如果没有,请将工作推送到存储过程并再次进行性能测试。如果不够快,分析执行计划,找出瓶颈。使用分页。不要做任何过早的优化。
-
非常明智的方法,我实际上已经尝试将分页添加到我的存储库中,但结果证明这是一个糟糕的选择,因为我需要在分页之前进行过滤......所以基本上分页应该扩展一个 IQueryable
.
标签: c# design-patterns asp.net-core entity-framework-core