You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询含1主键3外键的数据库?ASP.NET MVC视图替换外键为名称

解决ASP.NET MVC非EF场景下多外键关联查询显示名称问题

需求说明

在ASP.NET MVC(非Entity Framework)的视图中,需要填充一个包含3个外键的表格,原本仅显示外键ID,现在要显示对应主键表TableA中的Config名称,需通过关联查询实现。

表格结构

TableA(主键表,存储配置名称)

ID (pk)   Config
-----------------
1         TGP      
2         BFM
3         BSA

TableB(业务表,包含三个外键)

ID        ConfB_ID(fk)     ConfR_ID(fk)    ConfS_ID(fk)
--------------------------------------------------------
1         1
2                          1               3 
3         3                2 

期望查询结果

ConfB            ConfR           ConfS
----------------------------------------
TGP
                 TGP             BSA
BSA              BFM

当前问题

现有查询仅能关联获取ConfB对应的名称,无法处理ConfR和ConfS字段:

SELECT 
    TableB.*, TableA.Config AS ConfB
FROM 
    TableB 
LEFT JOIN 
    TableA ON TableB.ConfB_ID = TableA.ID;

解决方案:多次左连接关联TableA

由于三个外键都关联到TableA的ID字段,需要对TableA进行三次左连接,每次连接给表起不同别名,避免字段冲突,同时保留TableB的所有记录(左连接特性)。

修改后的SQL查询语句

SELECT 
    A_B.Config AS ConfB,
    A_R.Config AS ConfR,
    A_S.Config AS ConfS,
    TableB.ID -- 保留TableB的ID,如需其他业务字段可添加
FROM 
    TableB
-- 关联获取ConfB_ID对应的配置名称
LEFT JOIN TableA AS A_B ON TableB.ConfB_ID = A_B.ID
-- 关联获取ConfR_ID对应的配置名称
LEFT JOIN TableA AS A_R ON TableB.ConfR_ID = A_R.ID
-- 关联获取ConfS_ID对应的配置名称
LEFT JOIN TableA AS A_S ON TableB.ConfS_ID = A_S.ID;

ASP.NET MVC 示例代码

1. 视图模型(ViewModel)

创建用于接收查询结果的ViewModel:

public class TableBViewModel
{
    public string ConfB { get; set; }
    public string ConfR { get; set; }
    public string ConfS { get; set; }
    public int ID { get; set; } // 可根据需求添加TableB的其他字段
}

2. 控制器(Controller)

在控制器中执行SQL查询,将结果封装为ViewModel列表后传递给视图:

public ActionResult Index()
{
    List<TableBViewModel> dataList = new List<TableBViewModel>();
    // 替换为你的数据库连接字符串
    string connectionString = ConfigurationManager.ConnectionStrings["YourDbConn"].ConnectionString;
    
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        string sql = @"SELECT 
                            A_B.Config AS ConfB,
                            A_R.Config AS ConfR,
                            A_S.Config AS ConfS,
                            TableB.ID
                        FROM 
                            TableB
                        LEFT JOIN TableA AS A_B ON TableB.ConfB_ID = A_B.ID
                        LEFT JOIN TableA AS A_R ON TableB.ConfR_ID = A_R.ID
                        LEFT JOIN TableA AS A_S ON TableB.ConfS_ID = A_S.ID;";
        
        SqlCommand cmd = new SqlCommand(sql, conn);
        conn.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        
        while (reader.Read())
        {
            dataList.Add(new TableBViewModel
            {
                ID = Convert.ToInt32(reader["ID"]),
                ConfB = reader["ConfB"] != DBNull.Value ? reader["ConfB"].ToString() : "",
                ConfR = reader["ConfR"] != DBNull.Value ? reader["ConfR"].ToString() : "",
                ConfS = reader["ConfS"] != DBNull.Value ? reader["ConfS"].ToString() : ""
            });
        }
        conn.Close();
    }
    
    return View(dataList);
}

3. 视图(View)

在视图中遍历ViewModel列表生成表格:

@model List<TableBViewModel>

<table border="1" cellpadding="8">
    <thead>
        <tr>
            <th>ConfB</th>
            <th>ConfR</th>
            <th>ConfS</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>@item.ConfB</td>
                <td>@item.ConfR</td>
                <td>@item.ConfS</td>
            </tr>
        }
    </tbody>
</table>

内容的提问来源于stack exchange,提问作者Sapster77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:55:26