【问题标题】:How to create a charts in Razor Pages pulling data from the database?如何在 Razor Pages 中创建从数据库中提取数据的图表?
【发布时间】:2021-06-15 09:27:16
【问题描述】:

如何创建从数据库中提取的图表?我试过 MorrisJS、ChartJS、CanvasJS、HighCharts。但我认为我得到的最接近的是 ChartJS,所以希望我们能坚持下去。

我需要创建一个从数据库中提取数据并在数据库中使用多个表的图表,例如,数据库名称“Finance”,我需要一个比较 dbo.Revenue 和 Sum 中的金额总和的条形图dbo.Expense 中的金额按月计算。月份是 x 轴。 Something like this ,但我是通过在代码中添加值手动完成的。

我试图从数据库中提取,ar 是表名(收入)

public async Task<JsonResult> OnGetRevenueData()
        {
            ar21 =  await _context.ar21.ToListAsync();
            var arChart = new arChartModel();
            arChart.AmountList = new List<decimal?>();
            arChart.CategoryList = new List<string>();

            foreach (var r in ar21)
            {
                arChart.AmountList.Add(r.Amount);
                arChart.MonthList.Add(r.Month);
            }

            return new JsonResult(arChart);
        }

【问题讨论】:

    标签: database asp.net-core charts chart.js razor-pages


    【解决方案1】:

    这是一个您可以关注的工作演示:

    型号:

    public class Revenue
    {
        public int Id { get; set; }
        public decimal Amount { get; set; }
        public string Month { get; set; }
    }
    public class Expense
    {
        public int Id { get; set; }
        public decimal Amount { get; set; }
        public string Month { get; set; }
    }
    

    页面:

    @page
    @model IndexModel
    
    <canvas id="Chart1" width="500" height="300"></canvas>
       
    @section Scripts
    {
        <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.js" integrity="sha256-qSIshlknROr4J8GMHRlW3fGKrPki733tLq+qeMCR05Q=" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js" integrity="sha256-xKeoJ50pzbUGkpQxDYHD7o7hxe0LaOGeguUidbq6vis=" crossorigin="anonymous"></script>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.css" integrity="sha256-IvM9nJf/b5l2RoebiFno92E5ONttVyaEEsdemDC6iQA=" crossorigin="anonymous" />
        <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.js" integrity="sha256-arMsf+3JJK2LoTGqxfnuJPFTU4hAK57MtIPdFpiHXOU=" crossorigin="anonymous"></script>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.css" integrity="sha256-aa0xaJgmK/X74WM224KMQeNQC2xYKwlAt08oZqjeF0E=" crossorigin="anonymous" />
        <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" integrity="sha256-Uv9BNBucvCPipKQ2NS9wYpJmi8DTOEfTA/nH2aoJALw=" crossorigin="anonymous"></script>
        <script>
            $(document).ready(function () {
                $.ajax({
                    type: "Get",
                    url: "/?handler=RevenueData",   
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (response) {
                        console.log(response.revenue);
                        console.log(response.revenue.length);
                        var data = response.revenue;
                        var data2 = response.expense;
                        var labels = response.month;
                        var color1 = [];
                        var color2 = [];
                        for (var i = 0; i < response.month.length; i++)
                        {
                            color1.push("rgba(255, 99, 132, 0.2)");
                            color2.push("rgba(54, 162, 235, 0.2)");
                        }
      
                        var ctx = document.getElementById("Chart1");
                        var myChart = new Chart(ctx, {
                            type: 'bar',
                            data: {
                                labels: labels,
                                datasets: [{
                                    label: 'Revenue',
                                    data: data,
                                    backgroundColor: color1,
                                },
                                {
                                    label: 'Expense',
                                    data: data2,
                                    backgroundColor: color2
                                }]
                            },
                            options: {
                                responsive: false,
                                scales: {
                                    xAxes: [{
                                        ticks: {
                                            maxRotation: 90,
                                            minRotation: 80
                                        },
                                        gridLines: {
                                            offsetGridLines: true 
                                        }
                                    },
                                    {
                                        position: "top",
                                        ticks: {
                                            maxRotation: 90,
                                            minRotation: 80
                                        },
                                        gridLines: {
                                            offsetGridLines: true 
                                        }
                                    }],
                                    yAxes: [{
                                        ticks: {
                                            beginAtZero: true
                                        }
                                    }]
                                }
                            }
                        });
                      
                    },
                    error: function (response) {
                        alert(response.responseText);
                    }
                });
            });
        </script>
    }
    

    处理程序:

    public class IndexModel : PageModel
    {
        private readonly YourDbContext _context;
    
        public IndexModel(YourDbContext context)
        {
            _context = context;
        }
        public void OnGet()
        {
    
        }
        public JsonResult OnGetRevenueData()
        {
            var countRevenue = (from t in _context.Revenue
                               group t by new
                               {
                                   Month = t.Month
                               } into g
                               select  g.Sum(a=>a.Amount)
                               ).ToArray();
            var countExpense = (from t in _context.Expense
                                group t by new
                                {
                                    Month = t.Month
                                } into g
                                select g.Sum(a => a.Amount)
                               ).ToArray();
            var monthList = _context.Revenue.Select(a => a.Month).Distinct().ToArray();
            return new JsonResult(new { revenue = countRevenue, expense = countExpense, month = monthList });
        }
    }
    

    【讨论】:

    • 这太棒了!太感谢了。问题:如果我有类似工资单的东西要添加到我的支出中,我该怎么办var countPayroll = (from p in _context.payroll group p by new Month = p.Month} into g select g.Sum(a =&gt; a.Amount)).ToArray(); 然后我如何将工资单和费用一起添加?
    • 嗨@FlyingSpiderMonkey,你是什么意思把它们加在一起?你想像return new JsonResult(new{payroll=countPayroll , expense= countExpense})这样配置吗?
    • 嗯,喜欢JsonResult(new{spendings=countPayroll + countExpense}) 还是一种在 Linq 中添加的方法? Payroll 和 Expense 有 JobNum 类似 ID,我应该先加入 Linq 吗?
    • 您似乎想将具有相同 ID 的工资单和费用相加?如果是这样,我认为您可以先在 linq 中加入他们。我建议您可以分享模型设计和您的预期结果以创建一个新线程。
    • 嗨 Rena,我已经制作了一个详细版本,包括使用您当前的解决方案 stackoverflow.com/q/67981914/15397944
    猜你喜欢
    • 2020-05-05
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    相关资源
    最近更新 更多