protected override IList <Role> Read(DbDataReader reader)
        {
            IList <Role>  roles     = new List <Role>();
            SqlDataReader sqlReader = (SqlDataReader)reader;

            while (sqlReader.Read())
            {
                int  i    = -1;
                Role role = new Role();
                role.Id          = sqlReader.GetInt32(++i);
                role.Type        = RoleEnumUtils.getRoleType(sqlReader.GetString(++i));
                role.Description = sqlReader.GetString(++i);
                roles.Add(role);
            }
            return(roles);
        }
        protected override IList <Person> Read(DbDataReader reader)
        {
            SqlDataReader sqlReader = (SqlDataReader)reader;
            bool          goNext    = false;

            const int      START_COLUMN_POSSITION_OF_CAGE_INFORMATION = 15;
            const int      LOGIN_COLUMN_POSSITION = 2;
            IList <Person> persons = new List <Person>();

            while (goNext || sqlReader.Read())
            {
                int     i       = -1;
                Person  person  = new Person();
                Breeder breeder = null;
                Cleaner cleaner = null;
                person.Id        = sqlReader.GetInt32(++i);
                person.Password  = sqlReader.GetString(++i);
                person.Login     = sqlReader.GetString(++i);
                person.FirstName = sqlReader.GetString(++i);
                person.LastName  = sqlReader.GetString(++i);
                person.Phone     = sqlReader.GetString(++i);
                person.BirthDate = sqlReader.GetDateTime(++i);
                person.Active    = sqlReader.GetBoolean(++i);

                if (!sqlReader.IsDBNull(++i))
                {
                    person.LastActiveDate = sqlReader.GetDateTime(i);
                }

                if (!sqlReader.IsDBNull(++i))
                {
                    breeder                         = new Breeder(person);
                    breeder.AnimalGroup             = new AnimalGroup();
                    breeder.AnimalGroup.Id          = sqlReader.GetInt32(i);
                    breeder.AnimalGroup.Description = sqlReader.GetString(++i);
                    person = breeder;
                }
                else
                {
                    i += 1;
                }

                Role role = new Role();
                role.Id          = sqlReader.GetInt32(++i);
                role.Type        = RoleEnumUtils.getRoleType(sqlReader.GetString(++i));
                role.Description = sqlReader.GetString(++i);

                person.Role = role;

                if (!sqlReader.IsDBNull(++i))
                {
                    cleaner = new Cleaner(person);
                    cleaner.ChemicalQualification = sqlReader.GetBoolean(i);
                    person = cleaner;
                }

                if (breeder != null)
                {
                    breeder.Role = role;
                }
                else if (cleaner != null)
                {
                    cleaner.Role = role;
                }
                else
                {
                    person.Role = role;
                }

                string lastLogin = person.Login;


                if (!sqlReader.IsDBNull(START_COLUMN_POSSITION_OF_CAGE_INFORMATION))
                {
                    cleaner.Cages = new List <Cage>();
                    do
                    {
                        int  j    = START_COLUMN_POSSITION_OF_CAGE_INFORMATION - 1;
                        Cage cage = new Cage();
                        cage.Id      = sqlReader.GetInt32(++j);
                        cage.LengthM = sqlReader.GetInt32(++j);
                        cage.WidthM  = sqlReader.GetInt32(++j);
                        cleaner.Cages.Add(cage);
                        goNext = sqlReader.Read();
                    } while (goNext && lastLogin == sqlReader.GetString(LOGIN_COLUMN_POSSITION));
                }
                else
                {
                    goNext = false;
                }

                persons.Add(person);
            }
            return(persons);
        }