Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq查找第二个最高工资_C#_Linq - Fatal编程技术网

C# 使用linq查找第二个最高工资

C# 使用linq查找第二个最高工资,c#,linq,C#,Linq,我有以下sql查询来查找第二个最高工资 Select * From Employee E1 Where (2) = (Select Count(Distinct(E2.Salary)) From Employee E2 Where E2.Salary > E1.Salary) 我想把它转换成Linq声明。我想你要问的是找到薪水第二高的员工 如果是这样的话,那就差不多了 var employee = Employees .OrderByDescending(e =&

我有以下sql查询来查找第二个最高工资

Select * From Employee E1 Where (2) = (Select Count(Distinct(E2.Salary)) From Employee E2 Where 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<Employee >
    {
        #region IEqualityComparer<Employee> Members
        bool IEqualityComparer<Employee>.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<Employee>.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);

这将适用于重复记录以及第n个最高工资,只需使用take和skip即可。下面的ex适用于第3个最高工资,表中有重复记录-

emplist.OrderByDescending(x => x.Salary).Select(x=>x.Salary).Distinct().Take(3).Skip(2).First();

你想找到薪水第二高的员工吗?@Ian:是的,我想用Linq@Ian:谢谢你的回答。我还有一个问题。我想生成与我在Linq问题中发布的sql语句相同的sql语句。可能吗?如果是,那么怎么做呢?我想说,生成的SQL是底层LINQ提供程序的特权,通常不应该担心。在编写LINQ查询时,应该可以不考虑将生成什么SQL或是否会生成SQL。非常感谢您的澄清。@Santosh,@Lan Nelson,这不是对问题的回答,如果有i.e 5个最大工资,这不是一个解决方案,请看我的答案。@santosh要实现此功能,您只需在“OrderBy”行上方添加.GroupBye=>e.Salary,并将“OrderBy”更改为按“Key”而不是“Salary”对结果排序,然后查询将返回工资第二高的所有员工的列表。+1是个不错的主意,但不能与LINQ to SQL一起使用。您必须将所有内容拉回到客户端,并使用LINQ访问对象。我不确定OP是否负担得起这样做。@Saeed:我收到了这个错误,查询运算符'SkipWhile'不受支持。我使用的是C4。0@santosh,使用第一个相等比较器。@Saeed:LINQ to SQL将无法将IEqualityComparer实现转换为t-SQL。@santosh:要使其正常工作,尝试var lst=myDataContext.Employees.AsEnumerable;或在此代码之前的类似代码。你应该意识到这样做的后果;所有过滤都将在客户端上运行。嗨@MIltanMiltan!您是否有可能编辑答案,将其格式化为代码块格式,并解释代码解决问题的原因,以便询问问题的人知道如何在将来解决此问题,而不是在不解释代码为何有效的情况下交付代码?谢谢,欢迎来到SO!你应该包括一些解释,而不仅仅是代码。你可能应该删除这个答案,投票最多的答案是一个更好的解决方案。
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();
public class Program
{
    public static void Main()
    {
        IList<int> intList = new List<int>() { 10, 21, 91, 30, 91, 45, 51, 87, 87 };

        var largest = intList.Max();

        Console.WriteLine("Largest Element: {0}", largest);

        var secondLargest = intList.Max(i => {
            if(i != largest)
                return i;
            return 0;
        });

        Console.WriteLine("second highest element in list: {0}", secondLargest);
    }
}