在一个控制器操作中执行许多数据库往返是否可以

时间:2017-12-31 15:02:14

标签: c# design-patterns asp.net-core entity-framework-core

我正在撰写一个网页应用,其中包含管理信息中心,其中包含数据库中所有数据的摘要

此处正在使用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;
    }
}

3 个答案:

答案 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。