Облегченная только для чтения альтернатива DataTable для хранения данных из SqlDataReader? - PullRequest
1 голос
/ 28 ноября 2009

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

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

EDIT:

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

Ответы [ 5 ]

3 голосов
/ 28 ноября 2009
List<object[]>

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

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

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

1 голос
/ 28 ноября 2009

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

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

1 голос
/ 28 ноября 2009

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

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

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

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

0 голосов
/ 28 ноября 2009

Используйте это:

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

string[] MyArray = Variable1.ToArray();

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

0 голосов
/ 28 ноября 2009

Наилучшим выбором будет иметь тип, представляющий столбцы данных, а затем просто создать экземпляр этого класса для каждой строки, заполнить его свойства значениями из считывателя и сохранить экземпляры в 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.

Марк

...