Там какие-либо ловушки являются к использованию IEnumerable <T> типом возврата для данных SQL?

Другой способ посмотреть на это использует POSIX ACLs, это должно поддерживаться Вашей файловой системой, однако у Вас может быть мелкомодульная настройка всех команд в Linux тем же путем, Вы имеете тот же контроль в Windows (только без более хорошего UI). ссылка

Другая вещь изучить PolicyKit.

необходимо будет сделать довольно мало гугления для получения всего работающего, поскольку это - определенно не сила Linux в данный момент.

5
задан scottm 9 September 2009 в 14:39
поделиться

4 ответа

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

Объект соединения будет закрыт, когда вы прочитаете последнюю запись, и если вы прекратите чтение до этого объект подключения не будет удален. Если вы, например, знаете, что у вас всегда есть десять записей в результате и у вас есть только цикл, который считывает эти десять записей из перечислителя, не выполняя одиннадцатый вызов Read, который читает после последнего элемента, соединение не закрывается должным образом. Кроме того, если вы хотите использовать только часть результата, у вас нет возможности закрыть соединение, не прочитав остальные записи.

Даже встроенные расширения для счетчиков могут вызвать это, даже если вы явно используете их правильно:

foreach (MyType item in GetMyTypeObjects().Take(10)) {
   ...
}
2
ответ дан 13 December 2019 в 19:31
поделиться

Я бы не следовал этому образцу. Я бы не стал беспокоиться о нагрузке на сервер так сильно, как о блокировках. Следование этому шаблону интегрирует процесс извлечения данных в поток бизнес-логики, и это кажется универсальным рецептом для проблем; вы не представляете, что происходит на стороне итерации, и вы вливаетесь в нее. Получите данные одним выстрелом, а затем позвольте клиентскому коду перечислить их, как только вы закроете программу чтения.

6
ответ дан 13 December 2019 в 19:31
поделиться

Я рекомендую не выполнять предварительную оптимизацию. Во многих ситуациях соединения будут объединены.

Я также не ожидаю разницы в нагрузке на SQL Server - запрос уже скомпилирован и будет выполняться.

2
ответ дан 13 December 2019 в 19:31
поделиться

Меня беспокоит то, что вы полностью отдаете себя на милость клиента code.

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

Пока клиентский код использует foreach , , используя и т.д., или явно вызывает метод перечислителя Dispose , тогда все в порядке, но ничто не мешает ему делать что-то вроде этого:

var e = GetMyTypeObjects().GetEnumerator();
e.MoveNext();    // open the connection etc

// forget about the enumerator and go away and do something else
// now the reader, command and connection won't be closed/disposed
// until the GC kicks in and calls their finalisers
1
ответ дан 13 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

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