V případě provádění základního dotazu může fungovat tak (určitě je to možné) - nicméně v případě dotazování na nahou Table<T>
, možná budiž, že se to všechno nejprve vyrovná; možná byste mohli zkusit dotaz na počet během iterace nebo spustit trasování. V tomto případě mám podezření nejprve se uloží do vyrovnávací paměti.
Znovu uzavřeno:to také závisí na tom, zda někdo používá foreach
, pak ano:protože foreach
explicitně zlikviduje iterátor pomocí finally
. Nicméně! Není zaručeno, pokud to někdo udělá například (velmi zlobivý a laxní):
var iter = yourData.GetEnumerator();
if(iter.MoveNext()) {
Console.WriteLine(iter.Current.Name); // first record of, say, 20
}
// and don't dispose the iterator == bad
pak protože iterátor a:není zlikvidován, b:se nevyčerpává a c:nespadne, nevypne se správně (kterákoli z těchto 3 podmínek bude řádně zavřít). Zdůraznění:toto je patologický případ:normálně je přiměřeně bezpečné říci „uzavře se, ano“.
Pokud chcete zaručené bez vyrovnávací paměti, všimněte si, že "dapper" to má, pokud nastavíte buffered
na false
:
IEnumerable<Customer> customers = connection.Query<Customer>(
"select * from Customer", buffered: false);
(může také pracovat s parametry atd.)