Я не думаю, что C# поддерживает семантику Диапазона. Вы могли записать дополнительный метод хотя, как:
public static IEnumerator<Byte> Range(this byte[] array, int start, int end);
, Но как другие сказали, не должны ли Вы устанавливать индекс запуска тогда Take
, все, в чем Вы нуждаетесь.
Есть только два варианта:
Узнать, прочитав все строки (а затем вы можете их сохранить)
предварительно запустите специализированный запрос SELECT COUNT (*).
Двойное прохождение цикла DataReader действительно дорого, вам придется повторно выполнить запрос.
И (благодаря Питу Оханлону) второй вариант безопасен только для параллелизма, когда вы используете транзакцию с уровнем изоляции Snapshot. .
Поскольку вы все равно хотите сохранить все строки в памяти, единственный разумный вариант - прочитать все строки в гибком хранилище ( List <>
или DataTable
), а затем скопировать данные в любом формате, который вы хотите. Операция в памяти всегда будет намного эффективнее.
Как указано выше, набор данных или типизированный набор данных может быть хорошей временной структурой, которую вы можете использовать для фильтрации. SqlDataReader предназначен для очень быстрого чтения данных. Пока вы находитесь в цикле while (), вы все еще подключены к БД и ждете, пока вы сделаете то, что вы делаете, чтобы прочитать / обработать следующий результат, прежде чем он перейдет. В этом случае вы можете получить лучшую производительность, если вы получите все данные, закроете соединение с БД и обработаете результаты в автономном режиме.
Похоже, что люди ненавидят наборы данных, поэтому описанное выше можно сделать и с набором строго типизированных объектов.
Вы не можете получить количество строк непосредственно из считывателя данных, потому что это так называемый курсор с пожарным шлангом, что означает, что данные считываются построчно на основе чтение выполняется. Я бы не советовал делать 2 чтения данных, потому что существует вероятность того, что данные изменились между двумя чтениями, и, таким образом, вы получите разные результаты.
Что вы можете сделать, так это прочитать данные во временную структуру , и используйте это вместо второго чтения. В качестве альтернативы вам потребуется изменить механизм получения данных и использовать вместо него что-то вроде DataTable.