Использование SqlDataReader для заполнения списка <T> в c #

У меня есть класс, как показано ниже,

class Student
{
    public string Name {get; set;}
    public string Surname {get; set;}
    public int Age {get; set;}
    public string Address {get; set;}
}

И у меня есть таблица MySql с 50 000 записей. Структура таблицы выглядит следующим образом:

ID        NAME       SURNAME        AGE          ADDRESS
1         Joe        Philip         20           Moscow
2         Misha      Johny          25           London
...

И у меня есть код C #,

List students = new List();
string sql = "SELECT name,surname,age,address FROM Students";
command.CommandText = sql;
MySqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
    Student st = new Student();
    st.Name = reader["Name"].ToString();
    st.Surname = reader["Surname"].ToString();
    st.Age = Convert.ToInt32(reader["Age"].ToString());
    st.Address = reader["Address"].ToString();
    students.Add(st);
}

Но он работает очень медленно. Какой метод вы советуете, чтобы этот код работал быстрее?

ОБНОВИТЬ:

Когда я использую этот код,

DataTable dt = new DataTable();
adapter.Fill(dt);

Он работает очень хорошо, и скорость очень нормальная. Но в чем проблема, я пытаюсь это сделать с помощью собственных классов?

1
если я использую набор данных для этого, все эти данные будут расположены в memmory. Итак, какая разница, хочу ли я использовать свой собственный класс?
добавлено автор namco, источник
См. Мой ответ; вы, вероятно, получите лучшие ответы, если скажете нам, что вы собираетесь делать с данными этого студента.
добавлено автор Jacob, источник
Наша большая точка зрения заключается в том, что вам необязательно загружать записи all из базы данных. Если вам нужно только подмножество данных, вы можете ограничить свой запрос предложением where .
добавлено автор Jacob, источник
Из любопытства, почему вам нужно читать всю таблицу базы данных в памяти вообще ? Это общая идея баз данных, что они потенциально могут хранить гораздо больше данных, чем могут вписываться в память, и что мы должны обрабатывать запись данных по записи.
добавлено автор Vlad, источник
Это так же быстро, как это возможно, нет очевидного улучшения или надзора здесь - вам нужны все эти записи в памяти?
добавлено автор BrokenGlass, источник
Этот код не компилируется. Вы присваиваете string свойство int (возраст).
добавлено автор Klaus Byskov Pedersen, источник
Конечно, это медленно. Не читайте 50 000 записей в памяти сразу!
добавлено автор Gabe Moothart, источник

2 ответы

Если код работает медленно, самая большая причина в том, что существует 50 000 записей. Что вам нужно с 50 000 Student объектов? Если вы можете найти способ решить вашу проблему, не читая все эти записи и не создавая все эти объекты, у вас будет более быстрый код.

<�Сильный> Обновление

Использование вашего собственного класса в порядке. В большинстве случаев, когда все работает медленно, это потому, что ваш код привязан к I/O (вы тратите большую часть своего времени на ожидание ввода-вывода). Чтобы избежать всего этого ввода-вывода, вы можете уменьшить объем данных, которые вы извлекаете (возможно, устраняя несоответствующие столбцы или строки из ваших данных) или выполняете обработку в базе данных через более сложный запрос или хранимую процедуру.

Обновление 2

Чтобы ответить на ваш следующий вопрос (почему создание списка объектов происходит медленнее, чем получение DataSet ), я ожидал бы, что чтение всего запроса в виде DataSet будет только немного быстрее, чем создание объекта. Я не знаком с тем, как реализована эта библиотека MySQL .NET. Удивительно, что эти два метода имели бы большую разницу в скорости. Может быть, MySqlDataReader делает что-то глупое, как с помощью внутреннего DataSet . Если производительность сильно отличается между этими двумя, это, вероятно, то, что автор этой библиотеки должен исправить.

Обновление 3

Этот ответ для MySqlDataAdapter или MySqlDataReader для массового переноса? имеет хороший наконечник; настройка BatchSize для читателя может быть полезна. Если размер партии слишком мал для читателя, это сделает его менее эффективным с большим количеством записей, подобных вашим.

5
добавлено
Я пишу программу проверки экзамена. я буду использовать эту и другие данные, которые я не показал здесь для определения точек учеников. Я могу использовать DataSet здесь вместо класса Student. Но я предпочитаю использовать свой собственный класс. Там нет проблем с ОЗУ. Проблема только при заполнении списка данными. он работает очень медленно.
добавлено автор namco, источник
Не зная специфики того, какую обработку вы делаете над данными, мы не можем дать больше помощи. Более быстрый код - это код, который делает меньше, поэтому попробуйте найти способ сделать свой код меньше (например, выгрузка некоторой обработки в базу данных). См. Мое обновление.
добавлено автор Jacob, источник
См. Соответствующий вопрос stackoverflow. ком/вопросы/2768828/& hellip;
добавлено автор Jacob, источник

Использование индекса записи вместо coulmname делает производительность немного лучше использование

st.Name = reader[0].ToString();
instead of
st.Name = reader["Name"].ToString();

and 
st.Name = reader[0].ToString();
instead of 
st.Name = reader["surname"].ToString();
1
добавлено
Также обратите внимание, что индексирование строк должно иметь правильную чувствительность к регистру, иначе оно будет очень медленным. В этом случае реализация MySQL ADO.NET является странной. И это единственное для MySQL ADO, каждый другой тестируемый соединитель работал нормально.
добавлено автор nawfal, источник
Верстка сайтов HTML/CSS/JS/PHP
Верстка сайтов HTML/CSS/JS/PHP
3 439 участник(ов)

Правила группы: напишите !rules в чате. Группа Вк: vk.com/web_structure Freelancer: @web_fl Веб Дизайн: @dev_design Маркетолог: @topmarkening Автор: @M_Boroda

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

CSS — русскоговорящее сообщество
CSS — русскоговорящее сообщество
1 502 участник(ов)

Сообщество любителей CSS Возникли проблемы с CSS? – пиши сюда, обсудим и предложим самое лучшее решение Работа: @css_ru_jobs Правила: https://teletype.in/@css_ru/r1EWtQ2w7 Приходите в наши чаты @javascript_ru и @frontend_ru Флуд: @css_flood

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

Чат — Типичный Верстальщик
Чат — Типичный Верстальщик
1 080 участник(ов)

Основной канал: @tpverstak Обратная связь: @annblok Все ссылки на соц.сети проекта: http://taplink.cc/tpverstak ПРАВИЛА ЧАТА — https://teletype.in/@annblok/BygPgC3E7

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

Веб-Технологи: UI/UX, Вёрстка, Фронтенд
Веб-Технологи: UI/UX, Вёрстка, Фронтенд
167 участник(ов)

Всё про веб-дизайн и вёрстку. А также: HTML, CSS, флекс и бутстрапы, шаблонизаторы, препроцессоры, методологии, аглифаеры, улучшаторы и обфускаторы. Обсуждаем темы юзабилити, устраиваем А/В тесты лендингов, и проводим аудит.

DTP :: @DTPublish
DTP :: @DTPublish
147 участник(ов)

Обсуждаемые темы: полиграфия, препресс, верстка, дизайн, иллюстрации, скрипты, плагины. Канал - @DTPublishing

css_jobs
css_jobs
26 участник(ов)

Чат для вопросов по css и html: @css_ru Флуд: @css_flood Канал с вакансиями и резюме: @css_jobs_feed

css_флуд
css_флуд
10 участник(ов)