【问题标题】:How do I create a model and view based on a SQL Server stored procedure that returns a pivot table?如何基于返回数据透视表的 SQL Server 存储过程创建模型和视图?
【发布时间】:2021-07-04 12:57:59
【问题描述】:

我有一个非常复杂的存储过程,它返回一个数据透视表。该数据是动态的。列名会改变,列数也会改变。基于为特定医师审核的图表审核数量。这就是 SQL Server 从存储过程中为特定医师返回数据的方式。

Question                A    B      C    D     Average
--------------------------------------------------------
11_ChartWellOrg         5.0  6.0    6.0  6.0    5.8
12_HistInfoAdequate     5.0  6.0    5.0  5.0    5.3
14_PhysExamAdequate     6.0  6.0    6.0  6.0    6.0
16_AssessFormulation    6.0  6.0    5.0  6.0    5.8
18_PlanTreatAdequate    6.0  6.0    6.0  6.0    6.0
20_GlobalOverallAssess  6.0  6.0    6.0  6.0    6.0

过去,我只是把它放在一个 DataGrid 中,我可以用页面后面的代码来处理动态部分。

Public Sub BindGridView()
    Dim tc As New TestCode
    Dim dt As New DataTable

    If intType <> 3 Then
        dt = tc.GetDT(intParticipant, intActivity, intAuditor, dBatch)
    Else
        dt = tc.GetDT(intParticipant, intActivity, intAuditor, intMonth, intYrChartEntry, intDept)
    End If
    intRows = dt.Rows.Count
    intColumns = dt.Columns.Count

    gvPivot.DataSource = dt
    gvPivot.DataBind()
    gvPivot.HeaderRow.Visible = True
    gvPivot.HeaderRow.BackColor = Drawing.Color.FromArgb(79, 113, 185)
    GridFormat()

End Sub

现在的要求是我将其移至我们使用 ASP.NET Core 3.1 MVC 构建的 Web 门户。我想我可以将其加载到 DataTable 中并将其发送到此视图:

@using System.Data
@model DataTable

@{
}
<div>
    <div>
        <h4>Matrix</h4>
        <table id="tblData" class="table">
            <thead>
                <tr>
                    @foreach(DataColumn col in Model.Columns)
                    {
                        <th>@col.ColumnName</th>
                    }
                </tr>
            </thead>
            <tbody>
                @foreach (DataRow row in Model.Rows)
                {
                    <tr>
                        @foreach (DataColumn col in Model.Columns)
                        {
                            <td>@row[col.ColumnName]</td>
                        }
                    </tr>
                }
            </tbody>
        </table>
    </div>
</div>

我认为这将处理提供的 DataTable 的动态部分。

我不知道如何使用我的 DBContext 获取数据。我不认为这可以处理动态表或模型。我可以绕过 DBContext 并将这些数据拉到 DBContext 之外吗?这是不好的形式吗?我是 MVC 和实体框架的新手。到目前为止,我在门户网站上做得很好,这个只是在头和脖子上打败了我。建议?帮助?毒品?

如果我需要提供更多信息,请告诉我。我通常不会在论坛上发帖,因为答案似乎已经存在,我不必问这个问题。

【问题讨论】:

  • 只是不要尝试使用 EF 执行此操作。使用 Dapper,这是获取动态数据的完美工具。
  • 所以我对 MVC 和 EF 游戏非常陌生。 “使用 Dapper”真的对我没有帮助。我正在看 dapper,但我不确定它对我有什么帮助。我可以将它和 EF 与 Dapper 一起使用吗?整个门户是使用 EF Core 构建的。是否需要重写所有内容,或者我可以在项目的其余部分使用 EF 核心的同时使用 Dapper 提取这一数据集吗?
  • 它仍然是一个从存储过程返回的数据表,对吧?如果是这样,您不必为此使用 EF 类映射。这是一个可能比你需要的更复杂的例子,但给你一个想法codeproject.com/Articles/5263745/…
  • 好的,你们真是太棒了。我会承认的。这些看起来对我有帮助。我会全力以赴,看看我能得到什么。

标签: c# sql-server entity-framework-core asp.net-core-mvc visual-studio-2019


【解决方案1】:

所以答案很简单,我想多了。将数据放入 DataTable,然后让 View 处理动态部分就足够了。这就是我获得动态存储过程数据的方式:

var dt = new DataTable();

using (var command = context.Database.GetDbConnection().CreateCommand())
{
    command.CommandText = "YourStoredProcedureName";
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.AddWithValue(...);
    
if (command.Connection.State != ConnectionState.Open)
{
    command.Connection.Open();
}

using (var reader = command.ExecuteReader())
{
    dt.Load(reader);
}
}

我使用控制器将其放入正确的模型中:

[Route("[Controller]/[Action]/{IDParticipant_2}/{IDActivity}/{IDAuditor_5}/{BatchDate}")]
public async Task<ActionResult> ChartAuditMatrix(int IDParticipant_2, int IDActivity, int IDAuditor_5, DateTime BatchDate)
{
    DataTable table = await _chartAuditRepo.GetMatrix(IDParticipant_2, IDActivity, IDAuditor_5, BatchDate);
    var overallAssess = await _chartAuditRepo.GetOverallAssessmentNote(IDParticipant_2, IDActivity, IDAuditor_5, BatchDate);
    ViewBag.BatchDate = BatchDate;

    var model = new MatrixVM
    {
        Matrix = table,
        AllAuditAssessment = overallAssess
    };

    return View(model);
}

这是具有两个属性的模型,一个是容纳上方数据透视表的 DataTable:

public class MatrixVM
{
    public DataTable Matrix { get; set; }
    public AllAuditAssessment AllAuditAssessment { get; set; }
}

然后我使用模型作为处理 DataTable 结果的动态部分的视图的基础:

@using System.Data
@model MatrixVM

<div class="row">
    <div class="col-md-3 offset-1">
        <table id="tblMatrix" class="table" style="border: solid; background-color: white;">
            <thead style="background-color: darkgray;">
                <tr>
                    @foreach (DataColumn col in Model.Matrix.Columns)
                    {
                        @if (col.ColumnName == "ZZ_Average")
                        {

                            <th>Average</th>
                        }
                        else
                        {
                            <th>@col.ColumnName</th>
                        }

                    }
                </tr>
            </thead>
            <tbody>
                @foreach (DataRow row in Model.Matrix.Rows)
                {
                    <tr>
                        @foreach (DataColumn col in Model.Matrix.Columns)
                        {
                            <td>
                                @row[col.ColumnName]
                            </td>
                        }
                    </tr>
                }
            </tbody>
        </table>
    </div>

把这些事情想出来,不让应该如何做的想法妨碍我,有时可能是我的失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多