首页 > 代码库 > 全国排名的问题(linq 的连表查询 等同于sql的left join)
全国排名的问题(linq 的连表查询 等同于sql的left join)
前言:要获得全国排名,(因为权限问题,显示的数据不是全国的数据,而是某个分区的数据,因此,不能获得数据后排序得到排名)
显示本部的员工积分并且获得在全国的排名。
我的思路:获得显示的员工信息集合1,获得全国的员工ID,积分和,排名的数据集合2,根据集合1的员工在集合2里直接将排名取出
1、获得显示的员工信息 list1(具体就不展示了)
2、获得全国的员工ID,积分和,排名的数据集合2
表1:员工表 表2:积分表
一个员工可以有多条积分记录,也可能没有数据
1 var nationalPaiming = (from u in DbContext.Users 2 join ir in (from i in DbContext.Integrals 3 where i.IsDeleted == false 4 group i by i.UserID into g 5 select new 6 { 7 UserID = g.Key, 8 TotalScore = g.Sum(e => e.IntegralValue) //求员工的积分总和 9 }) on u.UserID equals ir.UserID10 into gc11 from gci in gc.DefaultIfEmpty() //相当于sql的左连表12 where (deptSystem == 0 ? true : d.DeptSystem == deptSystem)&& (state == 1 ? u.IsDeleted == false : u.IsDeleted == true) //表中可能没有员工的积分记录13 select new14 {15 UserId = u.UserID,16 totalScoure = gci==null?0:gci.TotalScore,17 }18 ).OrderByDescending(e=>e.totalScoure).ToList();
转化成viewModel (计算每个人员的排名)
1 List<UserRankingViewModel> list = new List<UserRankingViewModel>(); 2 for (int i = 0; i < nationalPaiming.Count; i++) 3 { 4 UserRankingViewModel model = new UserRankingViewModel(); 5 model.UserID = nationalPaiming[i].UserId; 6 model.TotalIntergal = nationalPaiming[i].totalScoure; 7 if (i == 0) //因为这里的循环的集合是按照总积分降序排列的,所以第一个排名一定是第一 8 { 9 model.Ranking = i + 1;10 }11 else12 {
// 判断这个员工的总分是否和上一个员工的总积分相同13 if (nationalPaiming[i].totalScoure == nationalPaiming[i - 1].totalScoure) 14 {15 model.Ranking = list[i - 1].Ranking; //相同则排名相同16 }17 else18 {19 model.Ranking = list[i - 1].Ranking + 1; //不同则是上一位员工的下一名20 }21 }22 list.Add(model);23 }
3、在返回页面时循环集合1实体转换
1 List<int> nationalUserIds = nationalList.Select(e => e.UserID).ToList();2 int index = userIds.IndexOf(viewModel.UserId);3 viewModel.NationalRanking = nationalList[index].Ranking;
注:仅个人思路及实现的笔记,不妥之处(或有更好的方法),请各位指正。
全国排名的问题(linq 的连表查询 等同于sql的left join)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。