//处理Skill的update public int HandleSkill(int userId, SkillModel[] skillModels) { for (int i = 0; i < skillModels.Length; i++) { int techId = skillModels[i].TechId; int levelValue = skillModels[i].Level; var level = dbSession.LevelDescriptionDal.LoadEntities(l => l.Level == levelValue).FirstOrDefault(); if (level == null) { level = dbSession.LevelDescriptionDal.LoadEntities(l => l.Level == 0).FirstOrDefault(); levelValue = 0; } var relation = dbSession.R_UserInfo_TechDal.LoadEntities(r => r.UserInfoId == userId && r.TechId == techId).FirstOrDefault(); if (relation == null) { if (levelValue != 0) { //还未有此关系 新增一条记录 R_UserInfo_Tech r = new R_UserInfo_Tech() { UserInfoId = userId, TechId = techId, LevelDescriptionId = level.Id }; dbSession.R_UserInfo_TechDal.Add(r); } } else { if (levelValue == 0) { //取消星级 删除记录 dbSession.R_UserInfo_TechDal.Delete(relation); } else { //只修改 relation.LevelDescriptionId = level.Id; dbSession.R_UserInfo_TechDal.Update(relation); } } } return(dbSession.SaveChanges()); }
public ActionResult SearchPerson(string conditions, string keywords, int?page) { int pageSize = 10; int pageIndex = 1; if (page != null) { pageIndex = page.Value; } int total = 0; if (string.IsNullOrEmpty(conditions) && string.IsNullOrEmpty(keywords)) { var result = new { data = "error, there is no search info!", total = 0 }; return(Json(result, JsonRequestBehavior.AllowGet)); } //定义两个集合方便后面做交集。。。 IQueryable <UserInfo> users; IEnumerable <UserInfo> newUsers = null; if (!string.IsNullOrEmpty(keywords)) { try { keywords = keywords.ToLower(); //先使用Lucene进行模糊搜索 List <int> searchedUid = SearchHelper.SeartchUser(keywords); users = UserInfoService.LoadEntities(u => searchedUid.Contains(u.Id)); } catch (Exception) { users = UserInfoService.LoadEntities(u => u.Id != 0); } } else { users = UserInfoService.LoadEntities(u => u.Id != 0); } if (!string.IsNullOrEmpty(conditions)) { //然后再进行精确搜索 var skillModels = JsonConvert.DeserializeObject <SearchModel>(conditions); var positions = skillModels.positions; var roles = skillModels.roles; //使用lambda表达式来进行查询 //先筛选大条件 然后再筛选小条件 if (positions.Count > 0) { users = users.Where(u => positions.Contains(u.PositionId)); } if (roles.Count > 0) { users = users.Where(u => roles.Contains(u.RoleId)); } if (skillModels.workYear != null) { users = users.Where(u => DateTime.Now.Year - u.HiredTime.Year >= skillModels.workYear); } if (skillModels.areas.Count > 0) { List <int> countryIds = new List <int>(); List <int> cityIds = new List <int>(); List <int> teamIds = new List <int>(); //先将所有的查询信息转为数组。然后统一处理 foreach (var item in skillModels.areas) { if (item.countryId != null) { countryIds.Add(item.countryId.Value); } if (item.cityId != null) { cityIds.Add(item.cityId.Value); } if (item.teamId != null) { teamIds.Add(item.teamId.Value); } } users = users.Where(u => cityIds.Contains(u.Group.CityId) && teamIds.Contains(u.GroupId)); } //通过自定义比较器,对两个集合做交集即可确定是否存在该Tech if (skillModels.techs.Count > 0) { List <R_UserInfo_Tech> r_techs = new List <R_UserInfo_Tech>(); List <SearchTechModel> paddingTech = new List <SearchTechModel>(); //先单独处理范围level foreach (var item in skillModels.techs) { if (item.techLevel == 2) { item.techLevel = 1; //2表示1-2级别,所以加上2 paddingTech.Add(new SearchTechModel() { techId = item.techId, techLevel = 2 }); } if (item.techLevel == 6) { //6表示所有级别 item.techLevel = 1; for (int i = 2; i <= 5; i++) { paddingTech.Add(new SearchTechModel() { techId = item.techId, techLevel = i }); } } } skillModels.techs = skillModels.techs.Concat(paddingTech).ToList(); foreach (var item in skillModels.techs) { R_UserInfo_Tech r = new R_UserInfo_Tech() { TechId = item.techId, LevelDescriptionId = item.techLevel }; r_techs.Add(r); } //先去数据库里查询一次。因为LINK TO OBJECT 不支持交集操作 newUsers = users.ToList().Where(u => u.R_UserInfo_Tech.Intersect(r_techs, new ComparerForRTech()).Count() > 0); } } try { //此时才会真正去数据库里做查询 使用匿名对象拿一些必须的属性。同时也防止出现循环序列化 List <SearchUserInfoModel> sResult = new List <SearchUserInfoModel>(); if (newUsers == null) { total = users.Count(); var realUsers = users.OrderBy(u => u.Id).Skip(pageSize * (pageIndex - 1)).Take(pageSize).Select(u => new { u.Id, u.Name, u.Email, GroupName = u.Group.Name, RoleName = u.Role.Name, PositionName = u.Position.Name }).ToList(); foreach (var u in realUsers) { SearchUserInfoModel s = new SearchUserInfoModel(u.Id, u.Name, u.Email, u.GroupName, u.RoleName, u.PositionName); s.Techs = getUserTechs(u.Id); if (s.Techs.Length > 70) { s.Techs = s.Techs.Substring(0, 70) + "......"; } sResult.Add(s); } } else { total = newUsers.Count(); var realUsers = newUsers.OrderBy(u => u.Id).Skip(pageSize * (pageIndex - 1)).Take(pageSize).Select(u => new { u.Id, u.Name, u.Email, GroupName = u.Group.Name, RoleName = u.Role.Name, PositionName = u.Position.Name }).ToList(); foreach (var u in realUsers) { SearchUserInfoModel s = new SearchUserInfoModel(u.Id, u.Name, u.Email, u.GroupName, u.RoleName, u.PositionName); s.Techs = getUserTechs(u.Id); if (s.Techs.Length > 70) { s.Techs = s.Techs.Substring(0, 70) + "......"; } sResult.Add(s); } } var res = new { data = sResult, total }; return(Json(res, JsonRequestBehavior.AllowGet)); } catch (Exception) { var result = new { data = "no matching data!!", total = 0 }; return(Json(result, JsonRequestBehavior.AllowGet)); } }