如何获取用户姓和名,将Books表关联的UserId映射为姓名赋值到ViewModel
实现方案
步骤1:调整BookViewModel定义
首先在你的BookViewModel类中新增用户姓名相关属性,示例如下:
public class BookViewModel { public Guid BookId { get; set; } public DateTime CreatedDate { get; set; } public decimal TotalPrice { get; set; } // 新增属性 public string FirstName { get; set; } public string LastName { get; set; } // 可选:直接添加全名字段,减少视图层拼接逻辑 // public string UserFullName { get; set; } }
步骤2:修改控制器Index方法
这里提供两种实现方案,优先推荐第一种连表查询方案,避免N+1数据库查询问题,性能更高。
方案一:EF Core 连表查询(推荐)
如果你的上下文已经包含Identity用户的DbSet<ApplicationUser>(默认Identity集成都会自动配置),直接关联Books表和Users表一次查询即可:
public async Task<IActionResult> Index() { var bookData = await _context.Books .Join(_context.Users, book => book.CreateByUser, user => user.Id, (book, user) => new BookViewModel { BookId = book.BookId, CreatedDate = book.CreatedDate, TotalPrice = book.TotalPrice, FirstName = user.FirstName, LastName = user.LastName // 如果用全名字段可以写成: // UserFullName = $"{user.LastName} {user.FirstName}" }).ToListAsync(); return View(bookData); }
方案二:使用注入的UserManager赋值
如果你需要严格使用注入的_userManager做用户查询,可以按如下方式修改,注意数据量大时该方案性能较低:
public async Task<IActionResult> Index() { var bookData = await _context.Books.Select(books => new BookViewModel { BookId = books.BookId, CreateByUser = books.CreateByUser, CreatedDate = books.CreatedDate, TotalPrice = books.TotalPrice }).ToListAsync(); // 遍历查询对应用户并赋值姓名 foreach (var book in bookData) { var user = await _userManager.FindByIdAsync(book.CreateByUser.ToString()); if (user != null) { book.FirstName = user.FirstName; book.LastName = user.LastName; } } return View(bookData); }
步骤3:修改Index视图
找到视图中原来展示UserId的代码行,替换为展示姓名的逻辑即可,示例:
<!-- 原来的UserId展示代码 --> <!-- <td>@item.CreateByUser</td> --> <!-- 替换为 --> <td>@item.LastName @item.FirstName</td> <!-- 如果用了全名字段就直接写:<td>@item.UserFullName</td> -->
内容的提问来源于stack exchange,提问作者User456
相关产品推荐
相关产品推荐

