Легкая альтернатива DataTable только для чтения для хранения данных из SqlDataReader?

StackOverflow https://stackoverflow.com/questions/1811870

  •  06-07-2019
  •  | 
  •  

Вопрос

Я использую SqlDataReader для чтения данных с SQL Server.Однако иногда я хочу кэшировать свои данные в памяти как только для чтения, облегченный, без подключения объект.В BCL я не нашел для себя никаких вариантов.Нужно ли мне писать собственную реализацию такого контейнера или они доступны?

Какие альтернативы у меня есть для хранения данных из базы данных в облегченной форме?Для меня Таблица данных вообще не кандидат.

РЕДАКТИРОВАТЬ:

Зная, какие данные я выбираю, я могу легко использовать LINQ для преобразования моего средства чтения в List<T> или что-то.Но вместо этого я хотел бы иметь возможность кэшировать данные, структуру которых я не знаю.

Это было полезно?

Решение

List<object[]>

кажется настолько легким, насколько это возможно.

А если вам нужна дополнительная функциональность, которую он предлагает (например, имена столбцов, поддержка привязки данных, сортировка, фильтрация), вы можете получить/инкапсулировать и добавить эту функциональность.

Ваше требование довольно расплывчато.Что значит легкий?Что такого в DataTable, что не подходит?Какая функциональность, предоставляемая DataTable, вам нужна?

Другие советы

Создайте свою собственную структуру данных.

BCL не должен быть всем для всех.Он состоит из строительных блоков.BCL содержит строительные блоки, необходимые для создания собственной структуры данных.

Если бы BCL содержал решения для каждой проблемы, это был бы раздутый беспорядок.Не каждая часть функциональности должна быть доступна «готово», иначе вам как программисту не останется ничего, что можно было бы добавить.

Кажется, у вас довольно четкие требования, которые отличаются от «обычных» моделей использования.Между наборами данных и ORM подавляющее большинство проектов прекрасно обходятся без той функциональности, которую требуют ваши требования.

Вы можете использовать List<Dictionary<String, Object>>, где ключ словаря — это имя столбца, а значение — значение ячейки.

Если у вас много строк, вы можете разделить имена столбцов на List<String> и ценности List<List<Object>> (или Array).

Лучшим выбором было бы иметь тип, представляющий столбцы ваших данных, а затем просто создавать экземпляр этого класса для каждой строки, заполнять его свойства значениями из средства чтения и сохранять экземпляры в List<YourClass> состав.

Что-то вроде:

using(SqlDataReader rdr = sqlCommand.ExecuteReader())
{
    List<YourClass> resultList = new List<YourClass>();

    while(rdr.Read())
    {
         YourClass work = new YourClass();

         // set the properties        
         work.Property1 = rdr["Column1"].Value;
         .....
         work.PropertyN = rdr["ColumnN"].Value;

         resultList.Add(work);
    } 
} 

По сути, это то, что делает любой ORM (объектно-реляционный преобразователь) — считывает данные из базы данных самым быстрым способом (DataReader) и конструирует из них объекты .NET.

Марк

Использовать это:

List<string> Variable1 = new List<string>();
//Do something with the generic

string[] MyArray = Variable1.ToArray();

Это самый легкий и эффективный объект для сохранения в памяти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top