使用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);