使用LINQ关联两表查询指定字段返回列表绑定MVC视图
问题根因
原代码无法返回正确关联数据的核心问题有3个:
- 没有编写两表关联逻辑:
id.FirstOrDefault().Name固定返回教会表的第一条记录,所有用户都会被匹配到同一个教会名称,完全没有按照UserTbl.C_ID对应CongregationTbl.ID的规则匹配关联数据。 - 查询结果使用匿名类型,在MVC做强类型视图绑定时存在访问限制,很容易出现绑定失败。
- 存在变量名大小写笔误:实例化的模型对象名为
MyModel,返回视图时传入的是小写开头的myModel,会直接触发编译报错。
修正方案
使用LINQ的join子句完成两表的外键关联,改用强类型类承载查询结果,避免匿名对象的绑定问题,修正笔误即可。
首先定义强类型类承载单条用户数据,原有MergeModel调整为使用该强类型集合:
// 单条待审核用户数据的强类型类 public class PendingUserItem { public string Name { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } public class MergeModel { public List<PendingUserItem> PendingUsers { get; set; } }
控制器中查询逻辑修正为关联查询写法:
using (Model1 dc = new Model1()) { var list = from user in dc.UserTbl // 按外键关联教会表 join cong in dc.CongregationTbls on user.C_ID equals cong.ID where user.AccountConfirmed == false select new PendingUserItem { Name = cong.Name, FirstName = user.FirstName, LastName = user.LastName }; MergeModel myModel = new MergeModel(); myModel.PendingUsers = list.ToList(); return View(myModel); }
视图中绑定MergeModel遍历输出即可得到和预期一致的表格效果:
@model MergeModel <table> <thead> <tr> <th>Name</th> <th>FirstName</th> <th>LastName</th> </tr> </thead> <tbody> @foreach (var user in Model.PendingUsers) { <tr> <td>@user.Name</td> <td>@user.FirstName</td> <td>@user.LastName</td> </tr> } </tbody> </table>
内容的提问来源于stack exchange,提问作者Manny
相关产品推荐
相关产品推荐

