[英]Display Query result of one table in another table for a View?
kpiRecord 表存储所有用户提交的 KPI 数据。 kpiMaster 表存储有关每个 KPI 的一般数据 - 即名称、部门、是否有目标或关键编号等。
在我的索引视图中,我想显示 kpiRecord 表中的所有记录。 但是,由于此表仅存储 KPI 编号(“kpiNo”),因此对于此列,我想从 kpiMaster 表中检索 KPI 名称(“kpiName”)并显示它。
如何查询我的 kpiMaster 表并在 Index 中的 kpiRecord 表中显示结果? (例如 SELECT kpiMaster.kpiName WHERE kpiRecord.kpiNo == kpiMaster.kpiNo)
Controller.cs
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);
}
kpiViewModel.cs
public class KpiViewModel {
public IEnumerable<kpiMaster> vmKpiMaster { get; set; }
public IEnumerable<kpiGoal> vmKpiGoal { get; set; }
public IEnumerable<kpiModel> vmKpiRecord { get; set; }
}
索引.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>
kpiMaster 表
kpi记录表
目前,我的索引如下所示:
它需要看起来像这样:
加入表格。
可以在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 Entity 和 kpiMaster Entity 可能包含一对一或一对多的关系,对吧?
如果 kpiRecord 实体包含导航属性( public kpiMaster kpiMaster { get; set; }
),您可以使用 model 中的导航属性来加载相关实体,示例代码如下:
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 方法中,您可以在查询 kpiRecord 时使用Include()
方法加载 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);
然后,在 View 中,使用以下代码显示 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>
如果您不使用导航属性,您可以使用join()
来加入表格,然后 select 所需的属性。 然后,显示结果,您可以参考以下示例:
创建一个包含所需属性的 ViewModel(例如:kpiName):
public class kpiModelViewModel
{
public int Id { get; set; }
public string kpiName { get; set; }
public DateTime activeTimestamp { get; set; }
public DateTime inactiveTimestamp { get; set; }
public bool isActive { get; set; }
public string submissionBy { get; set; }
public int kpiNo { get; set; }
public int kpiYear { get; set; }
public int kpiMonth { get; set; }
public int kpiWeek { get; set; }
public int kpiValue { get; set; }
}
public class KpiViewModel {
//public IEnumerable<kpiMaster> vmKpiMaster { get; set; }
//public IEnumerable<kpiGoal> vmKpiGoal { get; set; }
//public IEnumerable<kpiModel> vmKpiRecord { get; set; }
public IEnumerable<kpiModelViewModel> vmKpiRecord { get; set; }
}
controller 中的代码:
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.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>
结果是这样的:
参考:
在您的索引视图更改:
<td>@Html.DisplayFor(modelItem => item.kpiNo)</td>
至:
<td>@Html.DisplayHiddenFor(modelItem => item.kpiNo)</td>
<td>@Html.DisplayFor(modelItem => item.kpiName)</td>
并相应地修复标题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.