使用linq查找第二个最高薪水

san*_*ngh 8 c# linq

我有以下sql查询找到第二个最高薪水.


Select * From Employee E1 Where
    (2) = (Select Count(Distinct(E2.Salary)) From Employee E2 Where
        E2.Salary > E1.Salary)

我想将其转换为Linq语句.

Ian*_*son 23

我想你要问的是找到薪水第二高的员工?

如果是这样,那将是类似的

var employee = Employees
    .OrderByDescending(e => e.Salary)
    .Skip(1)
    .First();
Run Code Online (Sandbox Code Playgroud)

如果多个员工可能有相同的工资,并且您希望返回所有员工的IEnumerable,其薪水可以是第二高的:

var employees = Employees
    .GroupBy(e => e.Salary)
    .OrderByDescending(g => g.Key)
    .Skip(1)
    .First();
Run Code Online (Sandbox Code Playgroud)

(感谢@ diceguyd30建议后一种增强)

  • 我会说生成的SQL是底层LINQ提供程序的特权,通常不应该引起关注.应该可以编写LINQ查询而不考虑将生成什么SQL(或者实际上是否会生成SQL). (2认同)
  • @santosh做这项工作你只需要在'OrderBy'行上方添加`.GroupBy(e => e.Salary)`并更改'OrderBy'以按'Key'而不是'Salary'来排序结果然后查询将返回列出第二高工资的所有员工的清单. (2认同)

小智 5

List<Employee> employees = new List<Employee>()
{
    new Employee { Id = 1, UserName = "Anil" , Salary = 5000},
    new Employee { Id = 2, UserName = "Sunil" , Salary = 6000},
    new Employee { Id = 3, UserName = "Lokesh" , Salary = 5500},
    new Employee { Id = 4, UserName = "Vinay" , Salary = 7000}
};

var emp = employees.OrderByDescending(x => x.Salary).Skip(1).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

  • 您应该包含一些解释,而不仅仅是代码。 (6认同)