当前位置:Gxlcms > 数据库问题 > 全国排名的问题(linq 的连表查询 等同于sql的left join)

全国排名的问题(linq 的连表查询 等同于sql的left join)

时间:2021-07-01 10:21:17 帮助过:3人阅读

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.UserID 10 into gc 11 from gci in gc.DefaultIfEmpty() //相当于sql的左连表 12 where (deptSystem == 0 ? true : d.DeptSystem == deptSystem)&& (state == 1 ? u.IsDeleted == false : u.IsDeleted == true) //表中可能没有员工的积分记录 13 select new 14 { 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                 else
12                 {
// 判断这个员工的总分是否和上一个员工的总积分相同
13 if (nationalPaiming[i].totalScoure == nationalPaiming[i - 1].totalScoure) 14 { 15 model.Ranking = list[i - 1].Ranking; //相同则排名相同 16 } 17 else 18 { 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)

标签:

人气教程排行