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
相关产品推荐
相关产品推荐

