Sql 是否在视图的另一个表中显示一个表的查询结果?
kpiRecord表存储所有用户提交的KPI数据。kpiMaster表存储有关每个KPI的常规数据,即名称、部门、是否有目标或关键编号等 在我的索引视图中,我想显示kpiRecord表中的所有记录。但是,由于此表仅存储KPI编号(“kpiNo”),因此对于此列,我希望从kpiMaster表中检索KPI名称(“kpiName”),并显示它 如何查询kpiMaster表并在索引中显示kpiRecord表中的结果?(例如,选择kpiMaster.kpiName,其中kpiRecord.kpiNo==kpiMaster.kpiNo) 控制器Sql 是否在视图的另一个表中显示一个表的查询结果?,sql,asp.net-mvc,asp.net-core,Sql,Asp.net Mvc,Asp.net Core,kpiRecord表存储所有用户提交的KPI数据。kpiMaster表存储有关每个KPI的常规数据,即名称、部门、是否有目标或关键编号等 在我的索引视图中,我想显示kpiRecord表中的所有记录。但是,由于此表仅存储KPI编号(“kpiNo”),因此对于此列,我希望从kpiMaster表中检索KPI名称(“kpiName”),并显示它 如何查询kpiMaster表并在索引中显示kpiRecord表中的结果?(例如,选择kpiMaster.kpiName,其中kpiRecord.kpiNo==k
public async Task<IActionResult> Index() {
var tables = new KpiViewModel {
vmKpiMaster = _context.kpirep_dev_kpiMaster.ToList(),
vmKpiGoal = _context.kpirep_dev_kpiGoal.Where(kpiGoal => kpiGoal.isActive).ToList(),
vmKpiRecord = _context.kpirep_dev_kpiRecord.Where(kpiRecord => kpiRecord.isActive).ToList()
};
return View(tables);
}
公共异步任务索引(){
var tables=新KpiViewModel{
vmKpiMaster=_context.kpirep_dev_kpiMaster.ToList(),
vmKpiGoal=_context.kpirep_dev_kpiGoal.Where(kpiGoal=>kpiGoal.isActive).ToList(),
vmKpiRecord=\u context.kpirep\u dev\u kpiRecord.Where(kpiRecord=>kpiRecord.isActive).ToList()
};
返回视图(表);
}
kpiViewModel.cs
public class KpiViewModel {
public IEnumerable<kpiMaster> vmKpiMaster { get; set; }
public IEnumerable<kpiGoal> vmKpiGoal { get; set; }
public IEnumerable<kpiModel> vmKpiRecord { get; set; }
}
公共类KpiViewModel{
公共IEnumerable vmKpiMaster{get;set;}
公共IEnumerable vmKpiGoal{get;set;}
公共IEnumerable VMKPireRecord{get;set;}
}
Index.cshtml
<tbody>
@foreach (var item in Model.vmKpiRecord) {
<tr>
<td>@Html.DisplayFor(modelItem => item.kpiNo)</td>
<td>@Html.DisplayFor(modelItem => item.kpiYear)</td>
<td>@Html.DisplayFor(modelItem => item.kpiMonth)</td>
<td>@getKpiWeek(item.kpiYear, item.kpiWeek)</td>
<td>@Html.DisplayFor(modelItem => item.kpiValue)</td>
<td>
<a asp-action="DetailsRecord" asp-route-id="@item.ID" class=" btn btn-secondary">Details</a>
<a asp-action="DeactivateRecord" asp-route-id="@item.ID" class="btn btn-info">Deactivate</a>
<a asp-action="DeleteRecord" asp-route-id="@item.ID" class="btn btn-danger">Delete</a>
</td>
</tr>
}
</tbody>
@foreach(Model.vmKpiRecord中的var项){
@DisplayFor(modelItem=>item.kpiNo)
@DisplayFor(modelItem=>item.kpiYear)
@DisplayFor(modeleItem=>item.kpiMonth)
@getKpiWeek(item.kpiYear,item.kpiWeek)
@DisplayFor(modeleItem=>item.kpiValue)
kpiRecord表
目前,我的索引如下所示:
它需要看起来像这样:
在索引视图中更改:
<td>@Html.DisplayFor(modelItem => item.kpiNo)</td>
@Html.DisplayFor(modeleItem=>item.kpiNo)
致:
@Html.DisplayHiddenFor(modelItem=>item.kpiNo)
@DisplayFor(modeleItem=>item.kpiName)
并相应地修复该顺序。在索引视图中更改:
<td>@Html.DisplayFor(modelItem => item.kpiNo)</td>
@Html.DisplayFor(modeleItem=>item.kpiNo)
致:
@Html.DisplayHiddenFor(modelItem=>item.kpiNo)
@DisplayFor(modeleItem=>item.kpiName)
并相应地修正顺序。加入表格
您可以用SQL编写存储过程:
CREATE PROCEDURE [dbo].[GetKpiDetailedRecords]
AS
BEGIN
SELECT
*
FROM
KpiRecord R
INNER JOIN KpiMaster M ON M.KpiNo = R.KpiNo
END
或者在使用Linq的代码中:
var tables = new KpiViewModel {
vmKpiDetailedRecords = _context.kpirep_dev_kpiRecord.Where(kpiRecord => kpiRecord.isActive).Join(_context.kpirep_dev_kpiMaster,
master => master.KpiNo, record => record.KpiNo,
(record, master) => new {Kpi=master.KpiName,Year=record.KpiYear, ... }).ToList(),
vmKpiGoal = _context.kpirep_dev_kpiGoal.Where(kpiGoal => kpiGoal.isActive).ToList()
};
加入表格
您可以用SQL编写存储过程:
CREATE PROCEDURE [dbo].[GetKpiDetailedRecords]
AS
BEGIN
SELECT
*
FROM
KpiRecord R
INNER JOIN KpiMaster M ON M.KpiNo = R.KpiNo
END
或者在使用Linq的代码中:
var tables = new KpiViewModel {
vmKpiDetailedRecords = _context.kpirep_dev_kpiRecord.Where(kpiRecord => kpiRecord.isActive).Join(_context.kpirep_dev_kpiMaster,
master => master.KpiNo, record => record.KpiNo,
(record, master) => new {Kpi=master.KpiName,Year=record.KpiYear, ... }).ToList(),
vmKpiGoal = _context.kpirep_dev_kpiGoal.Where(kpiGoal => kpiGoal.isActive).ToList()
};
根据表结构和数据,kpiRecord包含外键(“kpiNo”),我想kpiRecord实体和kpiMaster实体可能是contains,对吗
如果kpiRecord实体包含(public kpiMaster kpiMaster{get;set;}
),则可以使用模型中的导航属性加载相关实体,示例代码如下:
public class kpirep_dev_kpiRecord
{
[Key]
public int ID { get; set; }
public DateTime activeTimestamp { get; set; }
//... //other properties
//used to configure one-to-one relationship.
[ForeignKey("kpiMaster")]
public int kpiNo { get; set; }
public kpirep_dev_kpiMaster kpiMaster { get; set; }
}
public class kpirep_dev_kpiMaster
{
[Key]
public int kpiNo { get; set; }
public string kpiName { get; set; }
}
在Controller方法中,您可以使用Include()
方法在查询kpiRecord时加载kpiMaster
var tables = new KpiViewModel
{
//vmKpiMaster = _context.kpirep_dev_kpiMaster.ToList(),
//vmKpiGoal = _context.kpirep_dev_kpiGoal.Where(kpiGoal => kpiGoal.isActive).ToList(),
vmKpiRecord = _context.kpirep_dev_kpiRecord.Where(kpiRecord => kpiRecord.isActive).Include(c => c.kpiMaster).ToList()
};
return View(tables);
然后,在视图中,使用以下代码显示kpiName:
<tbody>
@foreach (var item in Model.vmKpiRecord)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.kpiMaster.kpiName)</td>
<td>@Html.DisplayFor(modelItem => item.kpiYear)</td>
<td>@Html.DisplayFor(modelItem => item.kpiMonth)</td>
<td>@Html.DisplayFor(modelItem => item.kpiValue)</td>
<td>
<a asp-action="DetailsRecord" asp-route-id="@item.ID" class=" btn btn-secondary">Details</a>
<a asp-action="DeactivateRecord" asp-route-id="@item.ID" class="btn btn-info">Deactivate</a>
<a asp-action="DeleteRecord" asp-route-id="@item.ID" class="btn btn-danger">Delete</a>
</td>
</tr>
}
</tbody>
<tbody>
@foreach (var item in Model.vmKpiRecord)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.kpiName)</td>
<td>@Html.DisplayFor(modelItem => item.kpiYear)</td>
<td>@Html.DisplayFor(modelItem => item.kpiMonth)</td>
<td>@Html.DisplayFor(modelItem => item.kpiValue)</td>
<td>
<a asp-action="DetailsRecord" asp-route-id="@item.Id" class=" btn btn-secondary">Details</a>
<a asp-action="DeactivateRecord" asp-route-id="@item.Id" class="btn btn-info">Deactivate</a>
<a asp-action="DeleteRecord" asp-route-id="@item.Id" class="btn btn-danger">Delete</a>
</td>
</tr>
}
</tbody>
控制器中的代码:
var tables = new KpiViewModel
{
//vmKpiMaster = _context.kpirep_dev_kpiMaster.ToList(),
//vmKpiGoal = _context.kpirep_dev_kpiGoal.Where(kpiGoal => kpiGoal.isActive).ToList(),
vmKpiRecord = _context.kpirep_dev_kpiRecord.Where(kpiRecord => kpiRecord.isActive)
.Join(_context.kpirep_dev_kpiMaster, model => model.kpiNo, master => master.kpiNo, (model, master) => new { kModel = model, KMaster = master })
.Select(ModelandMaster => new kpiModelViewModel()
{
kpiName = ModelandMaster.KMaster.kpiName,
kpiYear = ModelandMaster.kModel.kpiYear,
kpiWeek = ModelandMaster.kModel.kpiWeek,
kpiValue = ModelandMaster.kModel.kpiValue
}).ToList()
};
return View(tables);
然后,使用ViewModel显示kpiName:
<tbody>
@foreach (var item in Model.vmKpiRecord)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.kpiMaster.kpiName)</td>
<td>@Html.DisplayFor(modelItem => item.kpiYear)</td>
<td>@Html.DisplayFor(modelItem => item.kpiMonth)</td>
<td>@Html.DisplayFor(modelItem => item.kpiValue)</td>
<td>
<a asp-action="DetailsRecord" asp-route-id="@item.ID" class=" btn btn-secondary">Details</a>
<a asp-action="DeactivateRecord" asp-route-id="@item.ID" class="btn btn-info">Deactivate</a>
<a asp-action="DeleteRecord" asp-route-id="@item.ID" class="btn btn-danger">Delete</a>
</td>
</tr>
}
</tbody>
<tbody>
@foreach (var item in Model.vmKpiRecord)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.kpiName)</td>
<td>@Html.DisplayFor(modelItem => item.kpiYear)</td>
<td>@Html.DisplayFor(modelItem => item.kpiMonth)</td>
<td>@Html.DisplayFor(modelItem => item.kpiValue)</td>
<td>
<a asp-action="DetailsRecord" asp-route-id="@item.Id" class=" btn btn-secondary">Details</a>
<a asp-action="DeactivateRecord" asp-route-id="@item.Id" class="btn btn-info">Deactivate</a>
<a asp-action="DeleteRecord" asp-route-id="@item.Id" class="btn btn-danger">Delete</a>
</td>
</tr>
}
</tbody>
@foreach(Model.vmKpiRecord中的var项)
{
@DisplayFor(modeleItem=>item.kpiName)
@DisplayFor(modelItem=>item.kpiYear)
@DisplayFor(modeleItem=>item.kpiMonth)
@DisplayFor(modeleItem=>item.kpiValue)
参考:
根据表结构和数据,kpiRecord包含外键(“kpiNo”),我想kpiRecord实体和kpiMaster实体可能是contains,对吗
如果kpiRecord实体包含(public kpiMaster kpiMaster{get;set;}
),则可以使用模型中的导航属性加载相关实体,示例代码如下:
public class kpirep_dev_kpiRecord
{
[Key]
public int ID { get; set; }
public DateTime activeTimestamp { get; set; }
//... //other properties
//used to configure one-to-one relationship.
[ForeignKey("kpiMaster")]
public int kpiNo { get; set; }
public kpirep_dev_kpiMaster kpiMaster { get; set; }
}
public class kpirep_dev_kpiMaster
{
[Key]
public int kpiNo { get; set; }
public string kpiName { get; set; }
}
在Controller方法中,您可以使用Include()
方法在查询kpiRecord时加载kpiMaster
var tables = new KpiViewModel
{
//vmKpiMaster = _context.kpirep_dev_kpiMaster.ToList(),
//vmKpiGoal = _context.kpirep_dev_kpiGoal.Where(kpiGoal => kpiGoal.isActive).ToList(),
vmKpiRecord = _context.kpirep_dev_kpiRecord.Where(kpiRecord => kpiRecord.isActive).Include(c => c.kpiMaster).ToList()
};
return View(tables);
然后,在视图中,使用以下代码显示kpiName:
<tbody>
@foreach (var item in Model.vmKpiRecord)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.kpiMaster.kpiName)</td>
<td>@Html.DisplayFor(modelItem => item.kpiYear)</td>
<td>@Html.DisplayFor(modelItem => item.kpiMonth)</td>
<td>@Html.DisplayFor(modelItem => item.kpiValue)</td>
<td>
<a asp-action="DetailsRecord" asp-route-id="@item.ID" class=" btn btn-secondary">Details</a>
<a asp-action="DeactivateRecord" asp-route-id="@item.ID" class="btn btn-info">Deactivate</a>
<a asp-action="DeleteRecord" asp-route-id="@item.ID" class="btn btn-danger">Delete</a>
</td>
</tr>
}
</tbody>
<tbody>
@foreach (var item in Model.vmKpiRecord)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.kpiName)</td>
<td>@Html.DisplayFor(modelItem => item.kpiYear)</td>
<td>@Html.DisplayFor(modelItem => item.kpiMonth)</td>
<td>@Html.DisplayFor(modelItem => item.kpiValue)</td>
<td>
<a asp-action="DetailsRecord" asp-route-id="@item.Id" class=" btn btn-secondary">Details</a>
<a asp-action="DeactivateRecord" asp-route-id="@item.Id" class="btn btn-info">Deactivate</a>
<a asp-action="DeleteRecord" asp-route-id="@item.Id" class="btn btn-danger">Delete</a>
</td>
</tr>
}
</tbody>
控制器中的代码:
var tables = new KpiViewModel
{
//vmKpiMaster = _context.kpirep_dev_kpiMaster.ToList(),
//vmKpiGoal = _context.kpirep_dev_kpiGoal.Where(kpiGoal => kpiGoal.isActive).ToList(),
vmKpiRecord = _context.kpirep_dev_kpiRecord.Where(kpiRecord => kpiRecord.isActive)
.Join(_context.kpirep_dev_kpiMaster, model => model.kpiNo, master => master.kpiNo, (model, master) => new { kModel = model, KMaster = master })
.Select(ModelandMaster => new kpiModelViewModel()
{
kpiName = ModelandMaster.KMaster.kpiName,
kpiYear = ModelandMaster.kModel.kpiYear,
kpiWeek = ModelandMaster.kModel.kpiWeek,
kpiValue = ModelandMaster.kModel.kpiValue
}).ToList()
};
return View(tables);
然后,使用ViewModel显示kpiName:
<tbody>
@foreach (var item in Model.vmKpiRecord)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.kpiMaster.kpiName)</td>
<td>@Html.DisplayFor(modelItem => item.kpiYear)</td>
<td>@Html.DisplayFor(modelItem => item.kpiMonth)</td>
<td>@Html.DisplayFor(modelItem => item.kpiValue)</td>
<td>
<a asp-action="DetailsRecord" asp-route-id="@item.ID" class=" btn btn-secondary">Details</a>
<a asp-action="DeactivateRecord" asp-route-id="@item.ID" class="btn btn-info">Deactivate</a>
<a asp-action="DeleteRecord" asp-route-id="@item.ID" class="btn btn-danger">Delete</a>
</td>
</tr>
}
</tbody>
<tbody>
@foreach (var item in Model.vmKpiRecord)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.kpiName)</td>
<td>@Html.DisplayFor(modelItem => item.kpiYear)</td>
<td>@Html.DisplayFor(modelItem => item.kpiMonth)</td>
<td>@Html.DisplayFor(modelItem => item.kpiValue)</td>
<td>
<a asp-action="DetailsRecord" asp-route-id="@item.Id" class=" btn btn-secondary">Details</a>
<a asp-action="DeactivateRecord" asp-route-id="@item.Id" class="btn btn-info">Deactivate</a>
<a asp-action="DeleteRecord" asp-route-id="@item.Id" class="btn btn-danger">Delete</a>
</td>
</tr>
}
</tbody>
@foreach(Model.vmKpiRecord中的var项)
{
@DisplayFor(modeleItem=>item.kpiName)
@DisplayFor(modelItem=>item.kpiYear)
@DisplayFor(modeleItem=>item.kpiMonth)
@DisplayFor(modeleItem=>item.kpiValue)
参考:
谢谢,但是现在我收到了错误:“无法将类型'System.Collections.Generic.List'隐式转换为'System.Collections.Generic.IEnumerable只要将=>new{…}更改为new KPidetaileRecord(){…}谢谢,但是现在我收到了错误:”无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.IEnumerable”,只需将=>new{…}更改为new kpiDetailedRecord(){…}