如何查询含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
相关产品推荐
相关产品推荐

