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

我有以下sql查询来查找第二个最高薪水。


选择*来自员工E1其中(2)=(选择计数(不同(E2.Salary))来自员工E2其中E2.Salary> E1.Salary) 

我想将其转换为Linq语句。

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

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

var employee = Employees .OrderByDescending(e => e.Salary) .Skip(1) .First(); 

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

 var employees = Employees .GroupBy(e => e.Salary) .OrderByDescending(g => g.Key) .Skip(1) .First(); 

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

你可以定义同样的比较器类如下:

  public class EqualityComparer : IEqualityComparer { #region IEqualityComparer Members bool IEqualityComparer.Equals(Employee x, Employee y) { // Check whether the compared objects reference the same data. if (Object.ReferenceEquals(x, y)) return true; // Check whether any of the compared objects is null. if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false; return x.Salary == y.Salary; } int IEqualityComparer.GetHashCode(Employee obj) { return obj.Salary.GetHashCode(); } #endregion } 

并使用它如下:

  var outval = lst.OrderByDescending(p => p.Id) .Distinct(new EqualityComparer()).Skip(1).First(); 

或者没有同等比较(两行):

  var lst2 = lst.OrderByDescending(p => p.Id).Skip(1); var result = lst2.SkipWhile(p => p.Salary == lst2.First().Salary).First(); 

编辑:正如Ani所说,使用sql应该做: var lst = myDataContext.Employees.AsEnumerable(); 但如果是商业软件,最好使用TSQL或找到另一种linq方式。

使用LINQ ,您可以找到第三个最高薪水,如下所示:

 // first use LINQ to sort by salary, then skip first 2 and get next var thirdHighestSalary= (from n in db.Employee order by n.salary descending select n).distinct().skip(2). FirstOrDefault() // write the result to console Console.WriteLine(Third Highest Salary is : {0},thirdHighestSalary.Salary);