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

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

kpiRecord表存储所有用户提交的KPI数据。kpiMaster表存储有关每个KPI的常规数据,即名称、部门、是否有目标或关键编号等

在我的索引视图中,我想显示kpiRecord表中的所有记录。但是,由于此表仅存储KPI编号(“kpiNo”),因此对于此列,我希望从kpiMaster表中检索KPI名称(“kpiName”),并显示它

如何查询kpiMaster表并在索引中显示kpiRecord表中的结果?(例如,选择kpiMaster.kpiName,其中kpiRecord.kpiNo==kpiMaster.kpiNo)

控制器

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(){…}