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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:09:21