• 暖风   2014/7/28 13:03:00
  • Linq分组查询之-多值查询
  • 关键字: linq 分组查询 groupby
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    /// <summary>要查询的对象</summary>
    class Employee {
       public int ID { get;set; }
       public string FName { getset; }
       public int Age { getset; }
       public char Sex { getset; }
    }
     
    如果对这个类的Age和Sex的连个字段进行分组,方法如下:
    // 先造一些数据
    List<Employee> empList = new List<Employee>();
    empList.Add(new Employee() {
       ID = 1, FName = "John", Age = 23, Sex = 'M'
    });
    empList.Add(new Employee() {
       ID = 2, FName = "Mary", Age = 25, Sex = 'F'
    });
     
    empList.Add(new Employee() {
       ID = 3, FName = "Amber", Age = 23, Sex = 'M'
    });
    empList.Add(new Employee() {
       ID = 4, FName = "Kathy", Age = 25, Sex = 'M'
    });
    empList.Add(new Employee() {
       ID = 5, FName = "Lena", Age = 27, Sex = 'F'
    });
     
    empList.Add(new Employee() {
       ID = 6, FName = "Bill", Age = 28, Sex = 'M'
    });
     
    empList.Add(new Employee() {
       ID = 7, FName = "Celina", Age = 27, Sex = 'F'
    });
    empList.Add(new Employee() {
       ID = 8, FName = "John", Age = 28, Sex = 'M'
    });
     
    接下来的做法是:
    // 实现多key分组的扩展函数版本
    var sums = empList
             .GroupBy(x => new { x.Age, x.Sex })
             .Select(group => new {
                Peo = group.Key, Count = group.Count()
             });
    foreach (var employee in sums) {
       Console.WriteLine(employee.Count + ": " + employee.Peo);
    }
     
    // 实现多key分组的lambda版本
    var sums2 = from emp in empList
                group emp by new { emp.Age, emp.Sex } into g
                select new { Peo = g.Key, Count = g.Count() };
    foreach (var employee in sums) {
       Console.WriteLine(employee.Count + ": " + employee.Peo);
    }
     
    这个例子中就充分利用了匿名类型