private List <T> Map <T>(SqlDataReader reader, ConfigProvader config)
        {
            var parsed = Parse(reader);
            var ans    = new List <T>();

            foreach (var dict in parsed)
            {
                ans.Add(config.Map <T>(dict));
            }
            return(ans);
        }
        private async Task <List <T> > MapAsync <T>(SqlDataReader reader, ConfigProvader config)
        {
            var parsed = await ParseAsync(reader);

            var ans = new List <T>();

            foreach (var dict in parsed)
            {
                ans.Add(config.Map <T>(dict));
            }
            return(ans);
        }
        public List <PersonGeneral> GetPeopleWithJoin()
        {
            var ans     = new List <PersonGeneral>();
            var command = new SqlCommand(GET_PEOPLE_JOIN, connection);

            command.CommandType    = System.Data.CommandType.StoredProcedure;
            command.CommandTimeout = 228;
            using (var scope = new TransactionScope())
            {
                var reader = command.ExecuteReader();
                while (reader.Read())
                {
                    var personGen = new PersonGeneral();

                    var dict = new Dictionary <string, object>();
                    for (int i = 0; i < 13; i++)
                    {
                        string name = reader.GetName(i);
                        object val  = reader.GetValue(i);
                        dict.Add(name, val);
                    }
                    personGen.Person = config.Map <Person>(dict);

                    dict = new Dictionary <string, object>();
                    for (int i = 13; i < 18; i++)
                    {
                        string name = reader.GetName(i);
                        object val  = reader.GetValue(i);
                        dict.Add(name, val);
                    }
                    personGen.Password = config.Map <Password>(dict);

                    dict = new Dictionary <string, object>();
                    for (int i = 18; i < 23; i++)
                    {
                        string name = reader.GetName(i);
                        object val  = reader.GetValue(i);
                        dict.Add(name, val);
                    }
                    personGen.Email = config.Map <Email>(dict);

                    dict = new Dictionary <string, object>();
                    for (int i = 23; i < 27; i++)
                    {
                        string name = reader.GetName(i);
                        object val  = reader.GetValue(i);
                        dict.Add(name, val);
                    }
                    personGen.PersonPhone = config.Map <PersonPhone>(dict);

                    dict = new Dictionary <string, object>();
                    for (int i = 27; i < 36; i++)
                    {
                        string name = reader.GetName(i);
                        object val  = null;
                        try
                        {
                            val = reader.GetValue(i);
                        }
                        catch
                        {
                            continue;
                        }
                        dict.Add(name, val);
                    }
                    personGen.Address = config.Map <Address>(dict);

                    ans.Add(personGen);
                }
                reader.Close();
            }
            return(ans);
        }