Получите вторую по величине зарплату сотрудников, используя LINQ - PullRequest
1 голос
/ 28 июля 2010

У меня есть следующая сущность

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

в наборе результатов

Использование C # 3.0 и Dotnet framework 3.5

Ответы [ 4 ]

3 голосов
/ 28 июля 2010

Не уверен, какое поведение вы предпочитаете, вот две версии.

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


//select people with second highest overall
var q = from emp in Employees
        group emp by emp.Department into dept
        let seconds = dept.GroupBy(e => e.Salary).OrderByDescending(g => g.Key).Skip(1).First()
        from emp in seconds
        select emp;
0 голосов
/ 03 июля 2014

Этот запрос должен решить вашу цель:

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;
0 голосов
/ 11 июня 2014

// выбираем людей с зарплатой второго человека МУДРЫЙ ОТДЕЛ

var R = от m в x группе m по m. Отдел в g let sal = g.GroupBy (w => w.Salary) .OrderByDescending(w => w.Key) .Skip (1) .First (). Ключ пусть xz = g. Где (w => w.Salary == sal) из m в xz выберите m;

0 голосов
/ 28 июля 2010

У меня сейчас нет доступа к компилятору 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));
    }
}
...