我正在撰写一个网页应用,其中包含管理信息中心,其中包含数据库中所有数据的摘要。
此处正在使用MSSql。
有没有办法在一轮通话中从不同的表中获取所有这些数据?
我也关注我的存储库设计。我返回一个IQueryable,因为它不会有效地将所有数据作为IEnumerable在内存中获取并使用扩展方法在中间执行更多过滤/ pagin。
有没有更好的方法来建立我的存储库?
这是我的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 :(得分:2)
您没有提到,您使用哪种类型的数据库(SQLServer,MySql,Oracle,...)。
使用SQL从关系数据库中检索聚合数据非常容易。您可以定义视图并使用类似于此处的子选择:https://www.essentialsql.com/get-ready-to-learn-sql-server-19-introduction-to-sub-queries/
答案 1 :(得分:1)
如果您需要进行多次调用,因为数据来自不同的地方而且无法在单个数据库查询中请求,那么这不是问题。优化并缓存有意义的地方。
答案 2 :(得分:1)
传统上,如果您想从一次往返中获得大量数据,那么SQL Server的答案就是存储过程。实体框架可能有一种直接访问存储过程的方法,但是保持你的格式,可以从数据库中构建一个视图,从一个从多个查询中提取数据的存储过程,这样每个查询都在服务器端执行,然后结果被一次性拉回来。
直接访问存储过程:
http://www.entityframeworktutorial.net/stored-procedure-in-entity-framework.aspx
How to call Stored Procedure in Entity Framework 6 (Code-First)?
这要求存储过程操纵数据,以便它返回到一个表中。实体框架实际上并不是最好的方法,真正的目的是在添加自动完成时,更难以执行更新错误,例如没有WHERE子句的UPDATE和DELETE。