/// <summary>
        /// Get Pets by Person's gender
        /// </summary>
        /// <param name="petType">The Pet type</param>
        /// <remarks>Throws ArgumentNullException</remarks>
        /// <returns><see cref="Task{PetsByPersonGenderCollectionModel}"/></returns>
        public async Task <PetsByPersonGenderCollectionModel> GetPetsByPersonGender(Models.PetType petType)
        {
            var entitiesPetType = (Entities.PetType)(int) petType;

            var persons = await _petsRepository.GetPersonAndPets();

            //LINQ Query to get Pets by Person's gender and Pet type
            var entities = new PetsByPersonGenderCollection()
            {
                PetType            = entitiesPetType,
                PetsByPersonGender = persons.ToList()
                                     .Where(person => person.Pets != null)
                                     .GroupBy(person => person.Gender)
                                     .Select(g => new PetsByPersonGender
                {
                    Gender = g.Key,
                    Pets   = g.SelectMany(person => person.Pets.Where(pet => pet.Type == entitiesPetType)).OrderBy(x => x.Name)
                }).ToList()
            };

            //Map entities to models
            var models = _mapperService.Map(entities);

            return(models);
        }
        /// <summary>
        /// Display Cats by Person's gender
        /// </summary>
        /// <param name="petsByPersonGenderCollection">Cats by Person Gender list</param>
        static void DisplayCatsByPersonGender(PetsByPersonGenderCollection petsByPersonGenderCollection)
        {
            if (petsByPersonGenderCollection == null)
            {
                throw new Exception("Error fetching data..");
            }

            var catsByOwnerGender = petsByPersonGenderCollection.PetsByPersonGender;

            //Write output
            Console.WriteLine(catsByOwnerGender.ElementAt(0).Gender);

            catsByOwnerGender.ElementAt(0).Pets.Select(pet => pet.name).OrderBy(name => name).ToList().ForEach(catName =>
            {
                Console.WriteLine("\t" + catName);
            });

            Console.WriteLine(catsByOwnerGender.ElementAt(1).Gender);

            catsByOwnerGender.ElementAt(1).Pets.Select(pet => pet.name).OrderBy(name => name).ToList().ForEach(catName =>
            {
                Console.WriteLine("\t" + catName);
            });
        }
 public PetsByPersonGenderCollectionModel Map(PetsByPersonGenderCollection petsByPersonGenderCollection)
 {
     return(_mapper.Map <PetsByPersonGenderCollection, PetsByPersonGenderCollectionModel>(petsByPersonGenderCollection));
 }