如何在ASP.NET MVC中用LINQ两种语法关联两表并配置视图模型
ASP.NET MVC中实现Staff与Salary的关联查询(等效指定SQL)
首先,为了让视图能获得强类型绑定的支持(避免匿名类型带来的无提示、易出错问题),我建议先创建一个ViewModel来封装查询结果:
namespace Project.Model { public class StaffSalaryViewModel { public string Name { get; set; } // 这里的类型根据你数据库中VALUE字段的实际类型调整,比如int、decimal等 public decimal Value { get; set; } } }
一、LINQ查询语法实现
直接对应你给出的SQL内连接逻辑,用查询语法写的控制器代码如下:
LinQDataContext data = new LinQDataContext(); public ActionResult Index() { // 用LINQ查询语法实现内连接,和你的SQL逻辑完全等效 var staffWithSalary = from staff in data.Staff join salary in data.Salary on staff.ID equals salary.ID select new StaffSalaryViewModel { Name = staff.NAME, Value = salary.VALUE }; return View(staffWithSalary); }
二、LINQ方法语法实现
如果你更喜欢链式调用的方法语法,等效实现如下:
LinQDataContext data = new LinQDataContext(); public ActionResult Index() { // 用LINQ方法语法实现内连接,和查询语法逻辑完全一致 var staffWithSalary = data.Staff .Join( inner: data.Salary, outerKeySelector: staff => staff.ID, innerKeySelector: salary => salary.ID, resultSelector: (staff, salary) => new StaffSalaryViewModel { Name = staff.NAME, Value = salary.VALUE } ); return View(staffWithSalary); }
三、视图中的Model声明
因为我们返回的是IEnumerable<StaffSalaryViewModel>类型的集合,所以视图顶部必须声明对应的强类型Model:
@model IEnumerable<Project.Model.StaffSalaryViewModel>
之后就可以在视图中安全地遍历数据了,比如用表格展示:
<table class="table"> <thead> <tr> <th>员工姓名</th> <th>薪资</th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td>@item.Name</td> <td>@item.Value.ToString("C")</td> <!-- 如果是货币类型可以格式化显示 --> </tr> } </tbody> </table>
补充说明
如果你临时不想创建ViewModel,想用匿名类型的话(不推荐,因为没有强类型检查,容易出现运行时错误),视图里可以这样声明Model:
@model IEnumerable<dynamic>
但这种方式会丢失IDE智能提示,字段名拼写错误也只能在运行时发现,所以还是优先用ViewModel更稳妥。
内容的提问来源于stack exchange,提问作者AK109
相关产品推荐
相关产品推荐

