2016-11-27 8 views
1

私はシンプルなことをしようとしていました、私は最高の従業員リストの上位2つを取得したい従業員のコレクションを形成します。しかし、同じ給与を持つ複数の従業員がいる可能性があるので、最大2つの給与範囲に入る場合は、すべてを欲しいと覚えておいてください。以下、私が使用している私のコレクションです:競合が発生したときに、上位2つの結果を返す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拡張メソッドを使用して最初の2つのグループを取得し、これらの2つのグループにあるすべての従業員を印刷します。

しかし、なぜそれがすべての従業員を印刷しているのかわかりません。それを注文することさえありません。誰かが何か考えを共有して、このクエリの何が間違っているか教えてください。

答えて

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最初の2つのグループではなく、各グループで最初の2つを取っているため、クエリが機能しません –

+0

ありがとうございます。 – sunil20000

関連する問題