繁体   English   中英

显示一个表的查询结果在另一个表中的视图?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM