LinqとLambdaクエリで複数の値でグループ化GroupBy



class Employee {
   public int ID { get;set; }
   public string FName { get; set; }
   public int Age { get; set; }
   public char Sex { get; set; }
}

このクラスのAgeとSexの連続するフィールドをグループ化すると、次のようになります.
//       
List empList = new List();
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   Linq      
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);
}
 
  
 
  
 
  
 【Lambda  】
            List bookPersons = (from a in addressClassPersons
                                                      where a.AddressBookPerson != null
                                                      select a.AddressBookPerson).ToList().MapTo>().GroupBy(a => new
                                                        {
                                                            a.Id,
                                                            a.Name,
                                                            a.JobTitle,
                                                            a.FixedTelephone,
                                                            a.MobilePhone,
                                                            a.Email,
                                                            a.OrganizationId
                                                        })
                                                    .Select(g => new AddressBookPersonDto()
                                                    {
                                                        Id = g.Key.Id,
                                                        Name = g.Key.Name,
                                                        JobTitle = g.Key.JobTitle,
                                                        FixedTelephone = g.Key.FixedTelephone,
                                                        MobilePhone = g.Key.MobilePhone,
                                                        Email = g.Key.Email,
                                                        OrganizationId = g.Key.OrganizationId,
                                                        OrganizationName = g.Key?.OrganizationId > 0 ? _organizationManager.GetOrganization(g.Key.OrganizationId).DisplayName : String.Empty
                                                    }).ToList();
            
【Linq  】

            List addressBookPersons = (from a in addressClassPersons
                                                             where a.AddressBookPerson != null
                                                             group a by new {
                                                                 a.AddressBookPerson.Id,
                                                                 a.AddressBookPerson.Name,
                                                                 a.AddressBookPerson.JobTitle,
                                                                 a.AddressBookPerson.FixedTelephone,
                                                                 a.AddressBookPerson.MobilePhone,
                                                                 a.AddressBookPerson.Email,
                                                                 a.AddressBookPerson.OrganizationId
                                                             } into g
                                                            select new AddressBookPersonDto()
                                                            {
                                                                Id = g.Key.Id,
                                                                Name = g.Key.Name,
                                                                JobTitle = g.Key.JobTitle,
                                                                FixedTelephone = g.Key.FixedTelephone,
                                                                MobilePhone = g.Key.MobilePhone,
                                                                Email = g.Key.Email,
                                                                OrganizationId = g.Key.OrganizationId,
                                                                OrganizationName = g.Key?.OrganizationId > 0 ? _organizationManager.GetOrganization(g.Key.OrganizationId).DisplayName : String.Empty
                                                            }).ToList();