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

ASP.NET Core中LINQ连接双表填充嵌套ViewModel报错:must be reducible node

解决LINQ连接表转换ViewModel时的"must be reducible node"错误

问题场景

在ASP.NET Core Web应用中,尝试通过LINQ连接Users和Readvisors两张数据库表,用自定义的UserReadvisorViewModel(包含UserViewModel和ReadvisorViewModel两个子ViewModel)承载查询结果,最终转换为List<UserReadvisorViewModel>供视图展示。

已定义的ViewModel代码如下:

UserReadvisorViewModel

public class UserReadvisorViewModel
{
    public UserViewModel UserViewModel { get; set; } = null!;
    public ReadvisorViewModel ReadvisorViewModel { get; set; } = null!;
}

UserViewModel

public class UserViewModel
{
    public string Username { get; set; } = null!;
    // 其他属性...
}

ReadvisorViewModel

public class ReadvisorViewModel
{ 
    public string Name { get; set; } = null!;
    // 其他属性...
}

出错的查询代码

在Controller的Index方法中执行LINQ查询时抛出错误:

public IActionResult Index()
{
    List<UserReadvisorViewModel> lst;

    using (dbContext db = new dbContext())
    {
        lst = (from a in db.Users
               join b in db.Readvisors
                      on a.Id equals b.Id
               select new UserReadvisorViewModel
                      {
                          UserViewModel =
                              {
                                  Username = a.Username
                                  // 其他属性赋值...
                              },

                          ReadvisorViewModel =
                              {
                                  Name = b.Name,
                                  // 其他属性赋值...
                              }
                        }).ToList();
    }

    return View(lst);
}

错误信息

System.ArgumentException: '必须是可约简节点'

问题原因

查询中初始化UserReadvisorViewModel时,对子ViewModel使用了嵌套赋值语法(仅给子ViewModel的属性赋值,但未显式创建子ViewModel实例)。EF Core无法将这种语法转换为对应的SQL查询逻辑,因此抛出该错误。

修复方案

在初始化UserReadvisorViewModel时,必须显式创建UserViewModel和ReadvisorViewModel的实例,再为其属性赋值。修正后的代码如下:

public IActionResult Index()
{
    List<UserReadvisorViewModel> lst;

    using (dbContext db = new dbContext())
    {
        lst = (from a in db.Users
               join b in db.Readvisors
                      on a.Id equals b.Id
               select new UserReadvisorViewModel
                      {
                          UserViewModel = new UserViewModel
                          {
                              Username = a.Username
                              // 其他属性赋值...
                          },

                          ReadvisorViewModel = new ReadvisorViewModel
                          {
                              Name = b.Name,
                              // 其他属性赋值...
                          }
                        }).ToList();
    }

    return View(lst);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:40:32