IDataReader и “HasColumn”, Лучше всего приблизьтесь?

Одна из возможностей связана с внедрением зависимости. Скажем, был интерфейс, он мог бы выглядеть примерно так:

public interface IStartup
{
    void ConfigureServices(IServiceCollection services);
    void Configure(IApplicationBuilder app);
}

Однако метод Configure может принимать дополнительные параметры как часть структуры внедрения зависимостей. Например, у меня есть приложение, которое выглядит следующим образом:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //etc...
}

Так что теперь невозможно сделать это интерфейсом, потому что может быть любое количество вещей, переданных.

Кроме того, ConfigureServices на самом деле не является обязательным.

Наконец, на самом деле существует интерфейс под названием IStartup , но из-за вышеизложенных причин, я еще не видел, чтобы он использовался где-либо.

Бонус: вам даже не нужно иметь класс запуска, вся работа может быть выполнена при создании веб-хостинга путем вызова ConfigureServices и ] Configure методы.

6
задан Liam - Reinstate Monica 19 September 2014 в 08:43
поделиться

3 ответа

Много зависит от того, как Вы используете HasColumn. Вы называете его просто несколько раз, или неоднократно в цикле? Столбец, вероятно, будет там, или это абсолютно неизвестно заранее?

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

(Я, однако, по крайней мере, сохранил бы результат GetSchemaTable () в локальном var в рамках метода, чтобы не называть его дважды в быстрой последовательности, если не кэшируют его где-нибудь на всякий случай, что Ваш конкретный IDataReader ДЕЙСТВИТЕЛЬНО повторно создает его.)

Если Вы знаете заранее, что при нормальных обстоятельствах столбец, который Вы просите, будет присутствовать, метод исключения немного более приемлем (потому что столбец, не являющийся существует, на самом деле, исключительный случай). Даже если не, это могло бы работать немного лучше, но снова если Вы не называете его неоднократно, необходимо спросить себя, если производительность является действительно так большой частью беспокойства.

И если Вы называете его неоднократно, вероятно, необходимо рассмотреть другой подход так или иначе, такой как: назовите GetSchemaTable () однажды впереди, цикл через таблицу, и загрузите имена полей в Словарь или некоторую другую структуру, которая разработана для быстрых поисков.

1
ответ дан 17 December 2019 в 02:34
поделиться

Я бы не стал беспокоиться о влиянии на производительность. Даже если у вас есть таблица с 1000 столбцами (которая была бы огромной таблицей), вы все равно выполняете «сканирование таблицы» только для 1000 строк. Скорее всего, это будет тривиально.

Преждевременная оптимизация просто приведет вас к излишне сложной реализации. Внедрите версию, которая вам кажется лучшей, а затем измерьте влияние на производительность. Если это неприемлемо по сравнению с вашими требованиями к производительности, рассмотрите альтернативы.

0
ответ дан 17 December 2019 в 02:34
поделиться

Я думаю, что у меня есть разумный ответ для этого старого драгоценного камня.

Я бы выбрал первый подход, потому что он намного проще. Если вы хотите избежать исключения, вы можете кэшировать имена полей и выполнить TryGet в кеше.

public Dictionary<string,int> CacheFields(IDataReader reader)
{

    var cache = new Dictionary<string,int>();
    for (int i = 0; i < reader.FieldCount; i++)
    {
        cache[reader.GetName(i)] = i;
    }
    return cache;
}

Преимущество этого подхода в том, что он проще и дает вам лучший контроль. Также обратите внимание, что вы можете захотеть изучить сравнение без учета регистра или без учета каны, что сделает работу немного сложнее.

5
ответ дан 17 December 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: