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

如何为ViewModel添加搜索功能?排查代码类型转换错误

这个错误其实很好理解——就是类型不匹配导致的:AllUsers.Where(...)返回的是IEnumerable<ApplicationUser>(你的原始用户实体集合),但你试图把它直接赋值给UsersAndRolesViewModel类型的变量,这俩类型完全不兼容,编译器当然会报错啦。

咱们一步步把代码改对:

1. 先补全ViewModel的属性

你现在创建UserAndRoleViewModel实例时,没给FullName赋值,但后面又要靠这个属性筛选,所以首先得把这个属性加上:

var model = new UserAndRoleViewModel
{
    Id = usr.Id,
    Email = usr.Email,
    Roles = await _usermanager.GetRolesAsync(usr),
    PhoneNumber = usr.PhoneNumber,
    FullName = usr.FullName // 把用户实体里的FullName传递到ViewModel中
};

2. 修正搜索逻辑的赋值对象

你不该把筛选后的原始用户集合直接塞给ViewModel对象,而是要在已经转换好的AllUsersAndRoles(UserAndRoleViewModel的列表)里筛选,然后把结果赋值给ViewModel的UserAndRole属性:

if (!String.IsNullOrEmpty(searchString))
{
    // 注意是在转换后的ViewModel列表里筛选,不是原始的AllUsers
    UserAndRoleViewModel.UserAndRole = AllUsersAndRoles
        .Where(s => s.FullName.Contains(searchString))
        .ToList(); // 转成List,匹配ViewModel里属性的类型
}

3. 完整修正后的代码

把这些修改整合起来,最终的方法代码应该是这样的:

public async Task<IActionResult> ListUsers(string searchString)
{
    var allUsers = _application.Users.ToList();
    UsersAndRolesViewModel viewModel = new UsersAndRolesViewModel();
    List<UserAndRoleViewModel> allUsersAndRoles = new List<UserAndRoleViewModel>();

    foreach (var usr in allUsers)
    {
        var model = new UserAndRoleViewModel
        {
            Id = usr.Id,
            Email = usr.Email,
            Roles = await _usermanager.GetRolesAsync(usr),
            PhoneNumber = usr.PhoneNumber,
            FullName = usr.FullName // 补全FullName属性
        };
        allUsersAndRoles.Add(model);
    }

    viewModel.UserAndRole = allUsersAndRoles;

    if (!String.IsNullOrEmpty(searchString))
    {
        // 筛选转换后的ViewModel列表,赋值给ViewModel的对应属性
        viewModel.UserAndRole = allUsersAndRoles
            .Where(s => s.FullName.Contains(searchString))
            .ToList();
    }

    return View(viewModel);
}

额外的小优化

  • 变量名尽量遵循C#驼峰命名规范(比如把AllUsers改成allUsers),代码可读性会更好;
  • 如果用户量比较大,建议把筛选逻辑提前到EF查询阶段,减少数据库返回的数据量:
    // 先筛选再加载,而不是加载所有用户到内存后再筛选
    var userQuery = _application.Users.AsQueryable();
    if (!String.IsNullOrEmpty(searchString))
    {
        userQuery = userQuery.Where(u => u.FullName.Contains(searchString));
    }
    var allUsers = await userQuery.ToListAsync(); // 用异步的ToListAsync更高效
    
    这样能避免把所有用户都加载到内存,提升接口性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:02:01