全國排名的問題(linq 的連表查詢 等同於sql的left join)

前言:要得到全國排名,(由於權限問題,顯示的數據不是全國的數據,而是某個分區的數據,所以,不能得到數據後排序獲得排名)sql

顯示本部的員工積分而且得到在全國的排名。spa

個人思路:得到顯示的員工信息集合1,得到全國的員工ID,積分和,排名的數據集合2,根據集合1的員工在集合2裏直接將排名取出code

一、得到顯示的員工信息  list1(具體就不展現了)blog

二、得到全國的員工ID,積分和,排名的數據集合2排序

     表1:員工表     表2:積分表ci

    一個員工能夠有多條積分記錄,也可能沒有數據io

 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.UserID
10                                    into gc
11                                    from gci in gc.DefaultIfEmpty()  //至關於sql的左連表 能夠在給gc加where條件gc.where(e=>e.) 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 (計算每一個人員的排名)class

 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 }

三、在返回頁面時循環集合1實體轉換List

1  List<int> nationalUserIds = nationalList.Select(e => e.UserID).ToList();
2                 int index = userIds.IndexOf(viewModel.UserId);
3                 viewModel.NationalRanking = nationalList[index].Ranking;

 

 

注:僅我的思路及實現的筆記,不妥之處(或有更好的方法),請各位指正。select

相關文章
相關標籤/搜索