2016-11-27 73 views
1

我正在嘗試簡單的事情,形成員工集合,我想獲取前兩名最高員工名單。但請記住,可以有多個員工的薪水相同,所以如果他們落入最高兩個薪金範圍,我希望他們都是。下面是我收集的是我使用:當存在衝突時,Linq查詢返回前兩個結果,不起作用?

List<Employee> Employees = new List<Employee> 
      { 
       new Employee {EmployeeID = 1,EmployeeName ="A", Department ="Dept1", Salary = 10000 }, 
       new Employee {EmployeeID = 5,EmployeeName ="A1", Department ="Dept2", Salary = 12000 }, 
       new Employee {EmployeeID = 2,EmployeeName ="B", Department ="Dept1", Salary = 20000 }, 
       new Employee {EmployeeID = 3,EmployeeName ="C", Department ="Dept1", Salary = 20000 }, 
       new Employee {EmployeeID = 6,EmployeeName ="B1", Department ="Dept2", Salary = 4500 }, 
       new Employee {EmployeeID = 4,EmployeeName="D", Department ="Dept1", Salary = 30000 }, 
      }; 

和Employee類:

public class Employee 
    { 
     public int EmployeeID { get; set; } 
     public string EmployeeName { get; set; } 
     public string Department { get; set; } 
     public long Salary { get; set; } 
    } 

以下是我的查詢:

var result1 = from x in Employees 
        group x by x.Salary into g 
        from y in g.OrderBy(x=>x.Salary).Take(2) 
        select new { y.EmployeeID }; 

      foreach (var item in result1) 
      { 
       Console.WriteLine(item.EmployeeID); 
      } 

我想在這裏做的是首先,我根據工資將所有員工分組。然後對這些組進行排序,並採用TAKE擴展方法先取得前兩組,然後打印這兩組中的所有員工。

但我不知道爲什麼它打印所有的員工;它甚至沒有訂購它們。有人可以分享一些想法,並告訴我這個查詢有什麼問題嗎?

回答

0

您可以先選擇不同的高薪,並加入那些員工:

var q = 
     from s in Employees.Select(e => e.Salary).Distinct().OrderByDescending(s => s).Take(2) 
     from e in Employees.Where(e => e.Salary == s) 
     select e; 
+0

可以請你幫我在我的查詢,爲什麼它不工作? – sunil20000

+1

@ sunil20000你的查詢不起作用,因爲你在每組中前兩位,而不是前兩組 –

+0

得到它,謝謝。 – sunil20000