如何基于 SQL 服务器存储过程创建模型和视图,returns 数据透视表 table?
How do I create a model and view based on a SQL Server stored procedure that returns a pivot table?
我有一个非常复杂的存储过程,它 returns 一个数据的枢轴 table。这个数据是动态的。列名会改变,列数也会改变。基于为特定医生审计的图表审计数量。这就是 SQL 服务器 returns 来自特定医生的存储过程的数据的方式。
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 构建的门户网站。我想我可以将其加载到数据表中并将其发送到此视图:
@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 获取数据。我不认为这可以处理动态 tables 或模型。我可以绕过 DBContext 并将这些数据拉到 DBContext 之外吗?那是糟糕的形式吗?我是 MVC 和 Entity Framework 的新手。到目前为止,我在门户网站上做得很好,这个门户网站让我头疼。建议?帮助?毒品?
如果我需要提供更多信息,请告诉我。我通常不 post 上论坛,因为答案似乎已经在那里,我不必问这个问题。
所以答案很简单,我想多了。将数据放入 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);
}
}
我使用 Controller 将其放入正确的模型中:
[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);
}
这是具有两个属性的模型,一个是容纳上面的枢轴 table 的数据表:
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>
想出这些东西而不让应该如何完成的想法成为阻碍,有时可能是我的失败。
我有一个非常复杂的存储过程,它 returns 一个数据的枢轴 table。这个数据是动态的。列名会改变,列数也会改变。基于为特定医生审计的图表审计数量。这就是 SQL 服务器 returns 来自特定医生的存储过程的数据的方式。
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 构建的门户网站。我想我可以将其加载到数据表中并将其发送到此视图:
@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 获取数据。我不认为这可以处理动态 tables 或模型。我可以绕过 DBContext 并将这些数据拉到 DBContext 之外吗?那是糟糕的形式吗?我是 MVC 和 Entity Framework 的新手。到目前为止,我在门户网站上做得很好,这个门户网站让我头疼。建议?帮助?毒品?
如果我需要提供更多信息,请告诉我。我通常不 post 上论坛,因为答案似乎已经在那里,我不必问这个问题。
所以答案很简单,我想多了。将数据放入 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);
}
}
我使用 Controller 将其放入正确的模型中:
[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);
}
这是具有两个属性的模型,一个是容纳上面的枢轴 table 的数据表:
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>
想出这些东西而不让应该如何完成的想法成为阻碍,有时可能是我的失败。