ASP.NET MVC下拉列表如何关联查询获取用户等级为4的员工列表
错误原因说明
你原有写法的核心问题有3个:
- 语法错误:
db.CreateEmployee.Where(x=> x.Id)不符合Where方法的入参要求,Where需要返回布尔值的判断条件,你直接返回字段本身无法通过编译 - 性能问题:提前调用
ToList()会把整张表的数据全量加载到内存再过滤,数据量较大时会有严重性能损耗 - 逻辑错误:你需要匹配所有等级为4的用户对应的EmpId集合,而非单条Id的等值判断
正确实现方案
方案1:关联查询(推荐,单条SQL完成查询性能最优)
直接在EF查询中完成两表关联和条件过滤,最终直接生成下拉选项集合:
var EmpDropDown = db.CreateEmployee // 保留你原有筛选有效员工的逻辑,不需要可删除该条件 .Where(e => e.Status == true) // 关联User表中等级为4的记录 .Join( db.Master_Users.Where(u => u.用户等级字段名 == 4), e => e.EmpId, // Employee表的关联字段,如果你实际用的是主键Id就替换为e.Id u => u.EmpId, // User表的关联字段 (e, u) => new SelectListItem { Text = e.EmpNames, Value = e.EmpId.ToString() // 同上,实际用Id就替换为e.Id }) .ToList();
方案2:先查符合条件的Id集合再过滤(写法更易理解)
如果不习惯Join的写法,可以分两步实现:
// 第一步:查询所有等级为4的用户对应的EmpId集合 var level4EmpIds = db.Master_Users .Where(u => u.用户等级字段名 == 4) .Select(u => u.EmpId) .ToList(); // 第二步:筛选出Employee表中对应Id的员工,生成下拉选项 var EmpDropDown = db.CreateEmployee .Where(e => e.Status == true && level4EmpIds.Contains(e.EmpId)) .Select(e => new SelectListItem { Text = e.EmpNames, Value = e.EmpId.ToString() }) .ToList();
注意:将代码中的
用户等级字段名替换为你User表中存储用户等级的实际字段名即可。
内容的提问来源于stack exchange,提问作者smc develpments
相关产品推荐
相关产品推荐

