Многое зависит от того, как вы используете HasColumn. Вы называете это только один или два раза, или несколько раз в цикле? Вероятно, колонна там или заранее неизвестна?
Установка фильтра строк, вероятно, будет выполнять сканирование таблицы каждый раз. (Кроме того, теоретически, GetSchemaTable () может генерировать совершенно новую таблицу с каждым вызовом, что будет еще дороже - я не верю, что SqlDataReader делает это, но на уровне IDataReader, кто знает?) Но если вы только Назовите это один или два раза, я не могу представить, что это большая проблема (если у вас нет тысяч столбцов или чего-то в этом роде).
(Однако я бы, по крайней мере, сохранил результат GetSchemaTable () в локальной переменной внутри метода, чтобы не вызывать его дважды в быстрой последовательности, если не кэшировать его где-то, если ваш конкретный IDataReader действительно его регенерирует) .)
Если вы заранее знаете, что при нормальных обстоятельствах столбец, который вы запрашиваете, будет присутствовать, метод исключения будет более приемлемым (поскольку столбец, который там не существует, фактически является исключительным случаем). Даже если это не так, он может работать немного лучше, но, если вы не будете повторять его, вы должны спросить себя, действительно ли производительность вызывает такое большое беспокойство.
И если вы вызываете его неоднократно, вам, вероятно, следует в любом случае рассмотреть другой подход, например: вызвать GetSchemaTable () один раз, выполнить цикл по таблице и загрузить имена полей в словарь или какую-либо другую структуру, предназначен для быстрого поиска.