【问题标题】:how to make a chart linked to the C# database?如何制作链接到 C# 数据库的图表?
【发布时间】:2021-06-15 09:26:55
【问题描述】:

我想根据每个月的TRUE数显示图表

1.图表

var ctx = document.getElementById("canvas")
var lineChartData = {
labels: ['January', 'February', 'March'],
    datasets: [{
        label: 'VoyageEffectuer',
        borderColor: "MediumSeaGreen",
        backgroundColor: "MediumSeaGreen",
        fill: false,
        data: [30000, 30162, 26263],
        yAxisID: 'y-axis-1',
    }, {
        label: 'VoyageAnnuler',
        borderColor: "Tomato",
        backgroundColor: "Tomato",
        fill: false,
        data: [20000, 30162, 26263],
        yAxisID: 'y-axis-2'
    }]
};
window.myLine = Chart.Line(ctx, {
    data: lineChartData,
    options: {
        responsive: true,
        hoverMode: 'index',
        stacked: false,
        title: {
            display: true,
            text: 'Processes'
        },
        scales: {
            yAxes: [{
                type: 'linear', 
                display: true,
                position: 'left',
                id: 'y-axis-1',
            }, {
                type: 'linear',
                display: true,
                position: 'right',
                id: 'y-axis-2',

                // grid line settings
                gridLines: {
                    drawOnChartArea: false, // only want the grid lines for one axis to show up
                },
            }],
        }
    }
});

2.数据库表

DateEnregistrement VoyageEffectuer VoyageAnnuler
08/06/2021 18:14:42 TRUE True
08/06/2021 17:55:54 False False
10/05/2021 16:11:44 TRUE True

【问题讨论】:

  • 嗨@Geek Digitale,您想显示折线图,其中VoyageEffectuer 的计数总和为真,VoyageAnnuler 的计数总和在数据库中为真?
  • 是的,这正是我想要做的

标签: javascript c# asp.net-mvc asp.net-core chart.js


【解决方案1】:

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

型号:

public class VoyageVM
{
    public DateTime DateEnregistrement { get; set; }
    public bool VoyageEffectuer { get; set; }
    public bool VoyageAnnuler { get; set; }
}

查看:

<canvas id="canvas" width="400" height="400"></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>
        function GetJSON_Simple() {
            var resp = [];
            $.ajax({
                type: "GET",
                url: '/Home/GetJson',
                async: false,
                contentType: "application/json",
                success: function (data) {
                    resp.push(data);
                },
                error: function (req, status, error) {
                    // do something with error
                    alert("error");
                }
            });
            return resp;
        }
        var simpleData = GetJSON_Simple();
        console.log(simpleData)
        var ctx = document.getElementById("canvas")
        var lineChartData = {
            labels: simpleData[0].myDate,
            datasets: [{
                label: 'VoyageEffectuer',
                borderColor: "MediumSeaGreen",
                backgroundColor: "MediumSeaGreen",
                fill: false,
                data: simpleData[0].myEffectuer,
                yAxisID: 'y-axis-1'
            },
            {
                label: 'VoyageAnnuler',
                borderColor: "Tomato",
                backgroundColor: "Tomato",
                fill: false,
                data: simpleData[0].myAnnuler,
                yAxisID: 'y-axis-2'
            }]
        };

    window.myLine = Chart.Line(ctx, {
            data: lineChartData,
            options: {
            responsive: true,
            hoverMode: 'index',
            stacked: false,
            title: {
                display: true,
                text: 'Processes'
            },
            scales: {
                yAxes: [{
                type: 'linear',
                    display: true,
                    position: 'left',
                    id: 'y-axis-1',
                }, {
                type: 'linear',
                    display: true,
                    position: 'right',
                    id: 'y-axis-2',

                    // grid line settings
                    gridLines: {
                drawOnChartArea: false, // only want the grid lines for one axis to show up
                    },
                }],
            }
        }
    });
    </script>
}

控制器:

public class HomeController : Controller
{
    private readonly YourDbContext ctx;
    public HomeController(YourDbContext ctx)
    {
        this.ctx = ctx;
    }
    public async Task<ActionResult> GetJson()
    {
        var data = ctx.VoyageVM.ToList();
        var date = data.Select(a => a.DateEnregistrement.Month)
                    .Distinct()
                    .OrderBy(a => a).ToArray();
        var Effectuer = (from t in data
                        where t.VoyageEffectuer==true
                        group t by new { Month = t.DateEnregistrement.Month } into g
                        select new
                        {
                            Amount = g.Count(),
                            Month = g.Key.Month
                        }).ToList();
        var myEff = Effectuer.OrderBy(a =>a.Month)
                        .Select(a => a.Amount)
                        .ToList();
        var Annuler = (from t in data
                    where t.VoyageAnnuler == true
                    group t by new { Month = t.DateEnregistrement.Month } into g
                    select new
                    {
                        Amount = g.Count(),
                        Month = g.Key.Month
                    }).ToList();
        var myAnnu = Annuler.OrderBy(a => a.Month)
                        .Select(a => a.Amount)
                        .ToList();
        return new JsonResult(new { myDate = date, myEffectuer = myEff, myAnnuler = myAnnu });
    }
}

数据库上下文:

public class YourDbContext: DbContext
{
    public YourDbContext(DbContextOptions<YourDbContext> options)
        : base(options)
    {
    }
    public DbSet<VoyageVM> VoyageVM { get; set; }


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<VoyageVM>().HasNoKey();
    }
}

【讨论】:

  • 谢谢,但我在编译时收到警报,orca 我检查了错误我联系了以下错误:未捕获的类型错误:无法读取未定义的属性“myDate”,无法加载资源:服务器响应状态为 404 ()。
  • 404 表示服务器找不到这样的 url。请确保 `url: '/Home/GetJson' ` 是正确的。还要确保你有像我一样的返回数据。请分享更多代码。实际上它在我的项目中运行良好。
  • 编译'var data = ctx.VoyageVM.ToList();'时出错: CS0103: 当前上下文中不存在名称“ctx”
  • 这是您的 DbContext 实例。我将更新整个代码。
  • 好的,谢谢,我会更正并回复您
【解决方案2】:

ChartJSCore 是一个可以大大简化这一点的库。

您基本上会在控制器中构建图表,并将其添加到您的 ViewData。然后,您可以使用@Html.Raw(CreateChartCode("chart")) 来呈现适当的 JavaScript 代码,并使用您提供的 id 定位画布(在本例中为“图表”)。

GitHub repository's readme 中提供了更详细的示例。

【讨论】:

  • 如何链接数据库以显示图表,该图表将为我们提供 VoyageEffectuer 和 VoyageAnnuler 中的月份和“TRUE”数
  • 您应该考虑使用 Entity Framework Core。但是,我建议你也多看看这里提问的正确方式,因为如果你没有清楚地说明你想要什么,我就无法确切地知道你想要什么。
  • 我要根据数据库做折线图
猜你喜欢
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2023-03-22
  • 2011-08-27
  • 1970-01-01
  • 2013-06-20
相关资源
最近更新 更多