C# 如何基于返回透视表的SQL Server存储过程创建模型和视图?
我有一个非常复杂的存储过程,它返回数据透视表。这些数据是动态的。列名将更改,列数也可以更改。基于为特定医生审核的图表审核数量。这就是SQL Server如何从存储过程返回特定医生的数据C# 如何基于返回透视表的SQL Server存储过程创建模型和视图?,c#,sql-server,entity-framework-core,asp.net-core-mvc,visual-studio-2019,C#,Sql Server,Entity Framework Core,Asp.net Core Mvc,Visual Studio 2019,我有一个非常复杂的存储过程,它返回数据透视表。这些数据是动态的。列名将更改,列数也可以更改。基于为特定医生审核的图表审核数量。这就是SQL Server如何从存储过程返回特定医生的数据 Question A B C D Average -------------------------------------------------------- 11_ChartWellOrg 5.0 6.0 6.0 6.0
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
公共子BindGridView()
dimtc作为新的测试代码
Dim dt作为新数据表
如果输入3,则
dt=tc.GetDT(intParticipant、intActivity、intAuditor、dBatch)
其他的
dt=tc.GetDT(intParticipant、intActivity、intAuditor、intMonth、intYrChartEntry、intDept)
如果结束
intRows=dt.Rows.Count
intColumns=dt.Columns.Count
gvPivot.DataSource=dt
gvPivot.DataBind()
gvPivot.HeaderRow.Visible=真
gvPivot.HeaderRow.BackColor=Drawing.Color.FromArgb(79113185)
GridFormat()
端接头
现在的要求是,我将此迁移到我们使用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>
@使用System.Data
@模型数据表
@{
}
矩阵
@foreach(Model.Columns中的数据列col)
{
@col.ColumnName
}
@foreach(Model.Rows中的数据行)
{
@foreach(Model.Columns中的数据列col)
{
@行[列名称]
}
}
我认为这将处理提供的数据表的动态部分
我不知道如何使用DBContext获取数据。我认为这无法处理动态表或模型。我可以绕过DBContext并将此数据拉到DBContext之外吗?那是坏形式吗?我是MVC和实体框架的新手。到目前为止,我在门户网站上做得很好,这个网站简直是在折磨我。建议?帮忙?毒品
如果我需要提供更多信息,请告诉我。我通常不在论坛上发帖,因为答案似乎已经在那里了,我不必问这个问题。所以答案很简单,我想得太多了。将数据放入DataTable,然后让视图处理动态部分是所有必要的。这就是我获取动态存储过程数据的方式:
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结果动态部分的视图的基础:
@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>
@使用System.Data
@模型矩阵
@foreach(Model.Matrix.Columns中的DataColumn列)
{
@如果(col.ColumnName==“ZZ_平均值”)
{
平均值
}
其他的
{
@col.ColumnName
}
}
@foreach(Model.Matrix.Rows中的DataRow行)
{
@foreach(Model.Matrix.Columns中的DataColumn列)
{
@行[列名称]
}
}
思考这些事情,不让应该如何做的想法妨碍我,有时可能会让我失望。只是不要尝试用EF来做这件事。使用Dapper,这是获取动态数据的完美工具。所以我对MVC和EF游戏非常陌生。“使用简洁”真的帮不了我。我正在看dapper,我不知道它能帮我什么忙。我可以使用它和EF与Dapper一致吗?整个门户是使用EF Core构建的。是否所有的内容都需要重写,或者在项目的其余部分使用EF core时,我是否可以简洁地提取这一数据集?它仍然是从存储过程返回的数据表,对吗?如果是这样,您就不必为它使用EF类映射。这是一个可能比你们需要的更复杂的例子,但为了给你们一个想法,再举一个例子,好吧,你们真是太棒了。我承认这一点。这些看起来对我有帮助。我会全力以赴,看看能得到什么。
@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>