全国排名的问题(linq 的连表查询 等同于sql的left join)
前言:要获得全国排名,(因为权限问题,显示的数据不是全国的数据,而是某个分区的数据,因此,不能获得数据后排序得到排名)
显示本部的员工积分并且获得在全国的排名。
我的思路:获得显示的员工信息集合1,获得全国的员工ID,积分和,排名的数据集合2,根据集合1的员工在集合2里直接将排名取出
1、获得显示的员工信息 list1(具体就不展示了)
2、获得全国的员工ID,积分和,排名的数据集合2
表1:员工表 表2:积分表
一个员工可以有多条积分记录,也可能没有数据
var nationalPaiming = (from u in DbContext.Users
join ir in (from i in DbContext.Integrals
where i.IsDeleted == false
group i by i.UserID into g
select new
{
UserID = g.Key,
TotalScore = g.Sum(e => e.IntegralValue) //求员工的积分总和
}) on u.UserID equals ir.UserID
into gc
from gci in gc.DefaultIfEmpty() //相当于sql的左连表 可以在给gc加where条件gc.where(e=>e.)
where (deptSystem == ? true : d.DeptSystem == deptSystem)&& (state == ? u.IsDeleted == false : u.IsDeleted == true) //表中可能没有员工的积分记录
select new
{
UserId = u.UserID,
totalScoure = gci==null?:gci.TotalScore,
}
).OrderByDescending(e=>e.totalScoure).ToList();
转化成viewModel (计算每个人员的排名)
List<UserRankingViewModel> list = new List<UserRankingViewModel>();
for (int i = ; i < nationalPaiming.Count; i++)
{
UserRankingViewModel model = new UserRankingViewModel();
model.UserID = nationalPaiming[i].UserId;
model.TotalIntergal = nationalPaiming[i].totalScoure;
if (i == ) //因为这里的循环的集合是按照总积分降序排列的,所以第一个排名一定是第一
{
model.Ranking = i + ;
}
else
{
// 判断这个员工的总分是否和上一个员工的总积分相同
if (nationalPaiming[i].totalScoure == nationalPaiming[i - ].totalScoure)
{
model.Ranking = list[i - ].Ranking; //相同则排名相同
}
else
{
model.Ranking = list[i - ].Ranking + ; //不同则是上一位员工的下一名
}
}
list.Add(model);
}
3、在返回页面时循环集合1实体转换
List<int> nationalUserIds = nationalList.Select(e => e.UserID).ToList();
int index = userIds.IndexOf(viewModel.UserId);
viewModel.NationalRanking = nationalList[index].Ranking;
注:仅个人思路及实现的笔记,不妥之处(或有更好的方法),请各位指正。
全国排名的问题(linq 的连表查询 等同于sql的left join)的更多相关文章
- 分析比较多表查询中的IN与JOIN
IN 是子查询的关键字,JOIN 是连接的关键字,项目开发中经常会使用到多表查询,而子查询与连接正是实现多表查询的重要途径.那两者是怎么运行的?IN与JOIN哪个更好?下面就来分析与比较. 现在有te ...
- 005医疗项目-模块一:用户的查找:1.用户表查询的sql语句
这是医疗项目的第一个模块:做一个用户的查询,可以根据用户的账号,用户的名称,单位的名称,用户的类型去查询.要求效果如下:
- ACTION 中 单表查询语句 SQL写法
JSP页面 <tr> <td class="STYLE1"> <div align="center"> // 单击事件 调用 ...
- Entity Framework Core的坑:Skip/Take放在Select之前造成Include的实体全表查询
今天将一个迁移至 ASP.NET Core 的项目放到一台 Linux 服务器上试运行.站点启动后,浏览器打开一个页面一直处于等待状态.接着奇怪的事情发生了,整个 Linux 服务器响应缓慢,ssh命 ...
- LINQ TO SQL 中的join(转帖)
http://www.cnblogs.com/ASPNET2008/archive/2008/12/21/1358152.html join对于喜欢写SQL的朋友来说还是比较实用,也比较容易接受的东西 ...
- 【T-SQL基础】01.单表查询-几道sql查询题
概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...
- MySQL查询数据表中数据记录(包括多表查询)
MySQL查询数据表中数据记录(包括多表查询) 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: sele ...
- PHP处理多表查询时的SQL语句拆分与重新组装
在自己写框架时候会发现,多表查询组装SQL语句<?php $pre = "pre_"; $aid = "44"; $data = array(" ...
- sql多表查询(单表查询略过)
表library: 表borrow: 表reader: 1.等值连接:(常用) 原理:将多张表组合成一个逻辑大表,即字段相加记录相乘(笛卡尔积). 语法:select * from 表A,表B whe ...
随机推荐
- Scrum立会报告+燃尽图(十一月十八日总第二十六次):功能开发与讨论贡献分配规则
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
- 个人作业四:注册github
注册Github账户 账户名称:liurunhan Github地址:https://github.com/liurunhan
- 软工1816 · Alpha冲刺(5/10)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 后端代码复审 福大各个食堂的菜品口味量化.属性标记 组织前后端线下协作 接下来 ...
- Objective-C Json转Model(利用Runtime特性)
封装initWithNSDictionary:方法 该方法接收NSDictionary对象, 返回PersonModel对象. #pragma mark - 使用runtime将JSON转成Model ...
- lintcode-394-硬币排成线
394-硬币排成线 有 n 个硬币排成一条线.两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止.拿到最后一枚硬币的人获胜. 请判定 第一个玩家 是输还是赢? 样例 n = 1, 返回 ...
- Windows Forms编程实战学习:第三章 菜单
第三章 菜单 1,控件和容器 所有的Windows Forms控件都是从System.Windows.Forms.Control类继承的,相关类的层次结构如下图所示: MarshalByRefObje ...
- OSG学习:使用OSG中预定义的几何体
常用的内嵌几何体包括: osg::Box //正方体 osg::Capsule //太空舱 osg::Cone //椎体 osg::Cylinder //柱体 osg::HeightField //高 ...
- oracle impdp导入时 提示“ORA-39002: 操作无效 ORA-39070: 无法打开日志文件 ”
第一步:首先使用DBA权限的用户创建directory,我使用system ,可以在服务器本地创建,也可以远程连接sqlplus进行创建,使用的将是服务器上面的路径.要确保创建directory时,操 ...
- tooltips & click copy
tooltips & click copy shit antd & tooltips & click copy https://codesandbox.io/s/zx4wo7y ...
- IPv4编址及子网划分
在讨论IP编址之前,我们需要讨论一下主机与路由器连入网络的方法.一台主机通常只有一条链路链接到网络:当主机中的IP想发送一个数据报时,它就在链路上发送,主机与物理链路之间的边界叫做接口(interfa ...