Linq Group Joining And Aggregate Function

using System;

    using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace ConsoleApplication2

{

    class Program

    {

        static void Main(string[] args)

        {

             var continent = new[]

               {

                 new {continentD = 1, regionName = "Asia"},

                 new {continentD = 2, regionName = "Africa"},

                 new {continentD = 3, regionName = "Europe"}

               };

            var country = new[]

                   {

                      new { CountryID = 11, CountryName = "Arab",  continentD = 2},

                      new { CountryID = 2, CountryName = "Missore", continentD = 1}

                    };

           var city = new[]

                 {

                   new { CountryID = 11, city = "Mecca" },

                   new { CountryID = 11, city = "Medina" },

                   new { CountryID = 11, city = "Akik"  },

                   new { CountryID = 2, city = "Cairo" },

                  new { CountryID = 2, city = "Giza" }

                 };

           

           var result = from cit in city

                        join con in country  on  cit.CountryID   equals con.CountryID  

                        group cit by cit.CountryID into cityGroup

                        let cityGroupSingle = cityGroup.FirstOrDefault()

                        join con2 in country on cityGroupSingle.CountryID equals con2.CountryID

                        join region in continent on con2.continentD equals region.continentD

                        select new {

                        regionId = region.continentD,

                        country = con2.CountryName,

                        numberofCity = cityGroup.Count()

                       // numberofCity = cityGroup.Sum( x => x.CountryID) // valid

                       

                        };

             

            foreach (var item in result)

            {

                Console.WriteLine("Continent Id: " + item.regionId + ", Country: " + item.country + ", Number Of City: " + item.numberofCity);

            }

            var result2 = from con in country

                          join cit in city on con.CountryID equals cit.CountryID // Inter change in from cit in city  join con in country  on  cit.CountryID   equals con.CountryID  

                          group cit by cit.CountryID into cityGroup

                          let cityGroupSingle = cityGroup.FirstOrDefault()

                          join con2 in country on cityGroupSingle.CountryID equals con2.CountryID

                          join region in continent on con2.continentD equals region.continentD

                          select new

                          {

                              regionId = region.continentD,

                              country = con2.CountryName,

                              numberofCity = cityGroup.Count()

                              // numberofCity = cityGroup.Sum( x => x.CountryID) // valid

                          };

            Console.WriteLine();

            Console.WriteLine();

            foreach (var item in result2)

            {

                Console.WriteLine("Continent Id: " + item.regionId + ", Country: " + item.country + ", Number Of City: " + item.numberofCity);

            }

            /// I think the follwing is the best

            var result3 = from cit in city

                          group cit by cit.CountryID into cityGroup //Absent Here: join con in country on cit.CountryID equals con.CountryID

                         let cityGroupSingle = cityGroup.FirstOrDefault()

                         join con in country on cityGroupSingle.CountryID equals con.CountryID

                         join region in continent on con.continentD equals region.continentD

                         select new

                         {

                             Key = cityGroup.Key,

                             regionId = region.continentD,

                             country = con.CountryName,

                             numberofCity = cityGroup.Count()

                             // numberofCity = cityGroup.Sum( x => x.CountryID) // valid

                      };

            Console.WriteLine();

            Console.WriteLine();

            foreach (var item in result3)

            {

                Console.WriteLine("Key: " + item.Key + ", Continent Id: " + item.regionId + ", Country: " + item.country + ", Number Of City: " + item.numberofCity);

            }

            var result4 = from cit in city

                          group cit by cit.CountryID into cityGroup //Absent Here: join con in country on cit.CountryID equals con.CountryID and

                          //let cityGroupSingle = cityGroup.FirstOrDefault() is commented

                          join con in country on cityGroup.FirstOrDefault().CountryID equals con.CountryID

                          join region in continent on con.continentD equals region.continentD

                          select new

                          {

                              regionId = region.continentD,

                              country = con.CountryName,

                              numberofCity = cityGroup.Count()

                              // numberofCity = cityGroup.Sum( x => x.CountryID) // valid

                          };

            Console.WriteLine();

            Console.WriteLine();

            foreach (var item in result4)

            {

                Console.WriteLine("Continent Id: " + item.regionId + ", Country: " + item.country + ", Number Of City: " + item.numberofCity);

            }

            var resultx = from cit in city

                         group cit by cit.CountryID into cityGroup

                          join con2 in country on cityGroup.FirstOrDefault().CountryID equals con2.CountryID

                         join region in continent on con2.continentD equals region.continentD

                         select new

                         {

                             regionId = region.continentD,

                             country = con2.CountryName,

                             numberofCity = cityGroup.Count()

                             // numberofCity = cityGroup.Sum( x => x.CountryID) // valid

                         };

        }

    }

}