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

