C# 3.0 使用LINQ获得员工的第二高工资

C# 3.0 使用LINQ获得员工的第二高工资,c#-3.0,linq-to-entities,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 =

我有以下实体

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();
但是这个查询不起作用

例如

如果我有

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
在结果集中


使用C3.0和Dotnet framework 3.5不确定哪一个是您想要的行为,因此这里有两个版本

//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;

我现在没有访问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));
    }
}

//选择具有第二个人薪资部门的人员

var R=从m到x m部门将m分组为g 让sal=g.GroupByw=>w.Salary.orderbydowningw=>w.Key.Skip1.First.Key 设xz=g.Wherew=>w.Salary==sal 从xz中的m开始
选择m

此查询应能解决您的目的:

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;

但是这个查询不起作用,它以什么方式不起作用?我无法获得正确的输出。我必须将其绑定到datagridwindows应用程序,在该应用程序中,此查询只包含部门名称。我需要显示所有相关记录,如EmployeeID、EmpName、Department、salary。我认为查询当前跳过的是第一个部门,而不是薪水。您可能需要对每个部门运行一个子查询。如果有多个人拥有最高工资,您希望结果是什么?该查询有效,但如果假设我的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查询只返回一条第二高的薪资记录,在本例中,两者都不重复。尽管乔恩说得有道理。我将更新以符合您的要求。
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;