Создание конструктора класса в цикле for

#c# #asp.net

#c# #asp.net

Вопрос:

Хорошая ли методология кодирования для создания класса в цикле? То есть я вызываю свою базу данных для извлечения всех контактов, во время этого цикла я создаю класс contacts на основе идентификатора контакта (который снова вызывает DB для получения контактных данных на основе id). Это умное кодирование или расточительные ресурсы?

 MySqlDataReader reader = command.ExecuteReader();
while (reader.Read()) {
    Contact contact = new Contact(Convert.ToInt32(reader["contactid"]));
    userString = userString   contact.getSurname();
}
 
 public Contact(int id) {
    MySqlConnection connection = new MySqlConnection(Global.conn);
    connection.Open();
    MySqlCommand command = connection.CreateCommand();
    string sql = "SELECT * 
                    FROM contact 
                  WHERE contactid=@contactid";
    command.CommandText = sql;
    command.Parameters.AddWithValue("@contactid", id);
    MySqlDataReader reader = command.ExecuteReader();
    while (reader.Read()) {
        FirstName = reader["name"].ToString();
        Surname = reader["Surname"].ToString();
    }
}
 

Комментарии:

1. В этом нет ничего изначально неправильного. Почему вы открываете новое соединение и перечитываете контакт?

2. Немного информации об именовании: вы не создаете класс в цикле; вы создаете объект в цикле, который является экземпляром класса. Вы должны получить все данные, необходимые для Contact объекта, во время чтения и передать их своему экземпляру через конструктор или через инициализатор объекта .

3. Мне кажется немного странным. Я бы создал один запрос, который выбирает всю контактную информацию вместо подхода вложенного чтения.

4. Спасибо. Проблемы, с которыми я сталкиваюсь, заключаются в том, что у меня повсюду есть таблицы сопоставления. Таким образом, у контакта может быть несколько контактных телефонов. Это означает, что с точки зрения БД существует таблица mapping_contact_phone, которая имеет отношение 1 ко многим с телефонной таблицей. Таким образом, один запрос не работает для меня, поскольку я получаю несколько строк. Думал получить идентификатор контакта, вызвать конструктор, а затем запустить несколько отдельных операций чтения данных для создания переменных класса. Просто беспокоюсь о производительности в результате.

5. Если бы вы могли использовать ORM, такой как entity framework (или микро-ORM, такой как Dapper), это сделало бы вашу жизнь намного проще.