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

如何获取用户姓和名,将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 04:00:01