zoukankan      html  css  js  c++  java
  • 全国排名的问题(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.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 (计算每个人员的排名)

     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;

    注:仅个人思路及实现的笔记,不妥之处(或有更好的方法),请各位指正。

  • 相关阅读:
    2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 C: Coconut
    2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 A: Banana
    第2周项目1c++语言中函数参数传递的三种方式
    第2周项目2程序的多文件组织
    【BZOJ 3224】普通平衡树
    【POJ 1741】Tree
    浅谈树分治
    【luogu 2709 / BZOJ 3781】小B的询问
    【luogu 1972 / BZOJ 1878】HH的项链
    【BZOJ 3339 / BZOJ 3585 / luogu 4137】Rmq Problem / mex
  • 原文地址:https://www.cnblogs.com/zfdcp-028/p/5939411.html
Copyright © 2011-2022 走看看