2013-05-05 64 views
1

我有下面有3個重要領域LINQ GROUP BY和最大使用條款

public class Employee 
{ 
    public string Name 
    { 
     get; 
     set; 
    } 

    public string Department 
    { 
     get; 
     set; 
    } 

    public double Salary 
    { 
     get; 
     set; 
    } 
} 

我有這樣的員工列表Employee類。我想從他/她的部門的工資最高的各部門 中找到姓名員工。

我寫了下面的查詢,但它不工作。

List<Employee> list = new List<Employee>(); 
     list.Add(new Employee { Name="Hemant",Salary=10,Department="PTS"}); 
     list.Add(new Employee { Name = "Gunjan", Salary = 11, Department = "PTS" }); 
     list.Add(new Employee { Name = "Akshay", Salary = 8, Department = "PTS" }); 
     list.Add(new Employee { Name = "Omkar", Salary = 10, Department = "EBG" }); 
     list.Add(new Employee { Name = "Hemant1", Salary = 14, Department = "EBG" }); 

     var query1 = from e in list 
        group e by e.Department into g 
        select new { Dept = g.Key,MaxSal = g.Max((e) => e.Salary)}; 

     foreach (var item in query1) 
     { 
      Console.WriteLine("Department : " + item.Dept + " : " + " Salary is : " + item.MaxSal);     
     } 

但上面的一段代碼不起作用,我無法選擇員工姓名。我想我必須使用升序/降序條款並選擇第一條或最後一條記錄。但我無法弄清楚。有人可以幫忙嗎?

問候, 與Hemant斯赫拉爾

回答

3

是的,你應該OrderByDescending然後拿到First

var query1 = list.GroupBy(x => x.Department) 
       .Select(g => g.OrderByDescending(x => x.Salary).First()); 

下面是控制檯代碼:

foreach (var item in query1) 
{ 
    string output = string.Format("Deparment: {0}, Name: {1}, Max Salaray: {2}", 
            item.Department, item.Name, item.Salary 
     ); 

    Console.WriteLine(output); 
} 
+0

非常感謝我期待的。現在我試圖將其轉換爲等價的LINQ查詢:) – user2243747 2013-05-05 06:10:58

+0

@ user2243747:您不需要這樣做,我總是覺得lambda語法更簡單易用。在底層,linq語法將被轉換爲lambda語法。 – 2013-05-05 06:16:48