//按部门汇总
            IEnumerable<WeekReportWithDepartmentInfo> report = summary
            .GroupBy(x => new
            {
                x.DeptID,
                x.DeptName
            }).Select(g => new WeekReportWithDepartmentInfo
            {
                DeptID = g.Key.DeptID,
                DeptName = g.Key.DeptName,
                TotalNumber = g.Count(),
                WorkOvertime = g.Sum(a => a.WorkOverHours),
                WorkLeave = g.Where(a => a.IsNeedAttendance == true).Sum(a => a.WorkHours),
                PersonalLeave = g.Where(a => a.IsNeedAttendance == true).Sum(a => a.PersonalLeave),
                PaidLeave = g.Where(a => a.IsNeedAttendance == true).Sum(a => a.PaidLeave),
                LateAndLeavingEarly = g.Where(a => a.IsNeedAttendance == true).Sum(a => a.LateAndLeavingEarly)
            }).Skip(PageSize * (CurrentPage - 1)).Take(PageSize);

//总行数
            int rows = summary
            .GroupBy(x => new
            {
                x.DeptID,
                x.DeptName
            }).Count();

List<WeekReportWithDepartmentInfo> reportlist = new List<WeekReportWithDepartmentInfo>();
            IEnumerable<string> tempEmail;
            foreach (WeekReportWithDepartmentInfo item in report)
            {
                //找到当前部门的所有人
                tempEmail = employees.Where(e => e.DeptID == item.DeptID).Select(s => s.Email);
                item.TotalNumber = summary.Where(e => e.DeptID == item.DeptID).GroupBy(x => new {x.EmpID}).Count();
                ////汇总所有人的事假
                //item.PersonalLeave = personalLeave.Where(p => tempEmail.Contains(p.Key)).Sum(s => s.Value);

////汇总所有人的带薪假总工时
                //item.PaidLeave = paidLeave.Where(p => tempEmail.Contains(p.Key)).Sum(s => s.Value);

//double jialeave=JiaLeave.Where(p => tempEmail.Contains(p.Key)).Sum(s => s.Value);
                ////迟到早退工时
                //item.LateAndLeavingEarly = item.LateAndLeavingEarly - jialeave;
                //item.LateAndLeavingEarly = item.LateAndLeavingEarly < 0 ? 0 : item.LateAndLeavingEarly;

//汇总所有人的加班总工时
                //item.WorkOvertime = workOvertime.Where(p => tempEmail.Contains(p.Key)).Sum(s => s.Value);

//全勤人数
                item.QqingNumber = item.TotalNumber - summary.Where(s => s.IsNeedAttendance && s.DeptID == item.DeptID && s.AttendanceState != 9).Select(s => s.EmpID).Distinct().Count();//去重复
                //正常考勤时 item.WorkLeave

//缺勤率
                item.BsenteeismRatio = (item.LateAndLeavingEarly + item.PersonalLeave + item.PaidLeave) / item.WorkLeave * 100;
                //加班率
                item.OvertimeRatio = item.WorkOvertime / item.WorkLeave * 100;

reportlist.Add(item);
            }

//IEnumerable<KeyValue<string, double>> JiaLeave = leaveWithWeek.Where(l => l.TypeName != LeaveType.加班
            //                                                               && l.TypeName != LeaveType.补打卡)
            //                                                    .GroupBy(x => new { x.Email })
            //                                                    .Select(g => new KeyValue<string, double>
            //                                                    {
            //                                                        Key = g.Key.Email,
            //                                                        Value = g.Sum(a => (a.AskLeaveHour))
            //                                                    });

//签到(9:00-12:00)
                            tempAtdRec = attendances.Where(a => a.EmpID == emp.EmpID && a.RecDateTime > workDay.GetInTime().AddHours(-4) && a.RecDateTime < workDay.GetOutTime()).OrderBy(a => a.RecDateTime);
                            if (tempAtdRec.Count() > 0)
                            {
                                info.SigninTime = tempAtdRec.First().RecTime;
                                info.SigninDateTime = tempAtdRec.First().RecDateTime;
                            }
                            //签退(13:30-18:00)
                            tempAtdRec = attendances.Where(a => a.EmpID == emp.EmpID && a.RecDateTime > workDay.GetInTime() && a.RecDateTime < workDay.GetInTime().AddDays(1).AddHours(-4)).OrderByDescending(a => a.RecDateTime);
                            if (tempAtdRec.Count() > 0)
                            {
                                info.SignoutTime = tempAtdRec.First().RecTime;
                                info.SignoutDateTime = tempAtdRec.First().RecDateTime;
                            }

List IEnumerable的更多相关文章

  1. 先说IEnumerable,我们每天用的foreach你真的懂它吗?

    我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...

  2. 为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇

    最近写代码,遇到一个问题,微软基于List<T>自带的方法是public bool Remove(T item);,可是有时候我们可能会用到诸如RemoveAll<IEnumerab ...

  3. C# 索引器,实现IEnumerable接口的GetEnumerator()方法

    当自定义类需要实现索引时,可以在类中实现索引器. 用Table作为例子,Table由多个Row组成,Row由多个Cell组成, 我们需要实现自定义的table[0],row[0] 索引器定义格式为 [ ...

  4. Entity Framework中使用IEnumerable<T>、IQueryable<T>及IList<T>的区别

    1. IEnumerable<T> IEnumerable<T> :对于在内存中集合上运行的方法,返回的可枚举对象将捕获传递到方法的参数.在枚举该对象时,将使用查询运算符的逻辑 ...

  5. 你可能不知道的陷阱, IEnumerable接口

    1.  IEnumerable 与  IEnumerator IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的 ...

  6. 通过IEnumerable和IDisposable实现可暂停和取消的任务队列

    一般来说,软件中总会有一些长时间的操作,这类操作包括下载文件,转储数据库,或者处理复杂的运算. 一种处理做法是,在主界面上提示正在操作中,有进度条,其他部分不可用.这里带来很大的问题, 使用者不知道到 ...

  7. 判断IEnumerable<T>集合中是否包含有T对象

    比如,有角色集合中,只有用户创建有角色,才出现“分配”铵钮.反之,隐藏. IEnumerable有一个方法,叫Any:

  8. .NET面试题系列[11] - IEnumerable<T>的派生类

    “你每次都选择合适的数据结构了吗?” - Jeffery Zhao .NET面试题系列目录 ICollection<T>继承IEnumerable<T>.在其基础上,增加了Ad ...

  9. .NET面试题系列[10] - IEnumerable的派生类

    .NET面试题系列目录 IEnumerable分为两个版本:泛型的和非泛型的.IEnumerable只有一个方法GetEnumerator.如果你只需要数据而不打算修改它,不打算为集合插入或删除任何成 ...

  10. .NET面试题系列[9] - IEnumerable

    .NET面试题系列目录 什么是IEnumerable? IEnumerable及IEnumerable的泛型版本IEnumerable<T>是一个接口,它只含有一个方法GetEnumera ...

随机推荐

  1. Android 三档自定义滑动开关,禁止点击功能的实现,用默认的seekbar组件实现

    android三档自定义滑动开关,禁止点击功能的实现,普通开关网上有很多例子,三档滑动开关的则找了整天都没有相关例子,开始用普通开关的源码修改了自己实现了一个类,但效果不如人意,各种边界情况的算法很难 ...

  2. Sublime Text个性化设置

    个性化格式化代码快捷键 其余快捷键设置方法类似,但注意不要与软件自带快捷键冲突 选择Preferences,点击Key Bingdings - User 在打开的文件中添加,其中ctrl+alt+sp ...

  3. Java 数组在内存中的结构

    Java中的数组存储两类事物: 原始值(int,char,...),或者引用(对象指针). 当一个对象通过 new 创建,那么将在堆内存中分配一段空间,并且返回其引用(指针). 对于数组,也是同样的方 ...

  4. BZOJ_1012_[JSOI2008]_最大数maxnumber_(线段树/树状数组+RMQ)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1012 两种操作: 1.求序列末尾n个数中的最大值. 2.在序列末尾插入一个数. 分析 线段树求 ...

  5. openssl的CRYPTO_set_locking_callback

    openssl可以在多线程环境下使用,但前提是向openssl提供线程锁设施,通过CRYPTO_set_locking_callback设置. 在一些复杂软件环境环境中,可能存在多个上层模块同时使用o ...

  6. C#基础回顾:正则表达式

    C#基础回顾:正则表达式 写在前面:本文根据笔者的学习体会结合相关书籍资料对正则表达式的语法和使用(C#)进行基本的介绍.适用于初学者. 摘要:正则表达式(Regular Expressions),相 ...

  7. 腾讯微博OAuth2.0认证介绍

    腾讯微博开放平台,是基于腾讯微博系统,为广大开发者和用户提供的开放数据分享与传播平台. 广大开发者和用户登录平台后,就可以使用平台提供的开放API接口,创建应用从微博系统获取信息,或将新的信息传播到整 ...

  8. 【HTML】Intermediate7:Sectioning

    1.</article> 2.</section> can use h1 elements at the start of each section,which would b ...

  9. POJ-2296 Map Labeler 2sat

    题目链接:http://poj.org/problem?id=2296 二分+2sat,每个点的上下两个方向为2sat的两个状态. //STATUS:C++_AC_16MS_536KB #includ ...

  10. devexpress中gridcontrol 一些样式改变

    改变footer为扁平化效果 整个footer背景色CustomDrawFootere.Appearance.BackColor = Color.Transparent; e.Appearance.D ...