使用LINQ获得员工的第二高薪

时间:2010-07-28 04:23:38

标签: c#-3.0 linq-to-entities

我有以下实体

public class Employee
{
    public int EmployeeID { get; set; }
    public string EmployeeName { get; set; }
    public string Department { get; set; }
    public long Salary { get; set; }
}

我正在尝试使用LINQ找出每个部门员工的第二高工资。

到目前为止,我所做的就是

 var Query = (from emp in Employees
              orderby emp.Salary descending
              group emp by emp.Department into g
              select new
              {
                  id = g.Select(i=>i.EmployeeID),
                  sal  = g.Select(s=>s.Salary),
                  name = g.Select(n=>n.EmployeeName),
                  dept = g.Select(d=>d.Department)
              }

              ).Skip(1).ToList();

但是这个查询无效。

E.g。

假设我有

EmployeeID = 1,EmployeeName  ="A", Department ="Dept1", Salary = 10000
EmployeeID = 2,EmployeeName ="B", Department ="Dept1", Salary = 20000
EmployeeID = 3,EmployeeName ="C"  Department ="Dept1", Salary = 20000
EmployeeID = 4,EmployeeName="D",  Department ="Dept1", Salary = 30000
EmployeeID = 5,EmployeeName  ="A1", Department ="Dept2", Salary = 12000
EmployeeID = 6,EmployeeName ="B1", Department ="Dept2", Salary = 4500

预期输出

EmployeeID = 2,EmployeeName ="B", Department ="Dept1", Salary = 20000
EmployeeID = 3,EmployeeName ="C"  Department ="Dept1", Salary = 20000
EmployeeID = 6,EmployeeName ="B1", Department ="Dept2", Salary = 4500

在结果集中

使用C#3.0和Dotnet framework 3.5

4 个答案:

答案 0 :(得分:3)

不确定您的行为是什么,所以这里有两个版本。

//select people with second person's salary
var q = from emp in Employees
        group emp by emp.Department into g
        let salary = g.OrderByDescending(e => e.Salary).Skip(1).First().Salary
        let second = g.Where(e => e.Salary == salary)
        from emp in second
        select emp;


//select people with second highest overall
var q = from emp in Employees
        group emp by emp.Department into dept
        let seconds = dept.GroupBy(e => e.Salary).OrderByDescending(g => g.Key).Skip(1).First()
        from emp in seconds
        select emp;

答案 1 :(得分:0)

我现在无法访问C#编译器,但这应该可行:

List<Employee> employees = new List<Employee>();
foreach(var grouped in db.Employees.GroupBy(p=>p.Department))
{
    if (grouped.Count() > 1)
    {
        int tmpSalary = grouped.OrderByDescending(q=>q.Salary)
            .Skip(1).Take(1).Single().Salary;
        employees.Concat(grouped.Where(q=>q.Salary == tmpSalary));
    }
}

答案 2 :(得分:0)

//选择第二人的工资DEPARTMENT WISE

var R =来自m中的x         m组由m组成         let sal = g.GroupBy(w =&gt; w.Salary).OrderByDescending(w =&gt; w.Key).Skip(1).First()。Key         让xz = g.Where(w =&gt; w.Salary == sal)         来自m in xz         选择m;

答案 3 :(得分:0)

此查询应解决您的目的:

var employees = from emp in employeeList
                group emp by emp.Department into g
                let salary = g.GroupBy(e => e.Salary).OrderByDescending(e => e.Key).Skip(1).First().Key
                let second = g.Where(e => e.Salary == salary)
                from emp in second
                select emp;