В случай на изпълнение на основна заявка, това може работи по този начин (със сигурност е възможно) - обаче, в случай на заявка към гола Table<T>
, може всичко това първо се буферира; бихте могли да опитате да направите заявка за броя по време на итерацията или да изпълните проследяване. В този случай подозирам първо ще се буферира.
Повторно затворено:това също зависи;p Ако някой използва foreach
, тогава да:тъй като foreach
изрично премахва итератора чрез finally
. Въпреки това! Не е гарантирано, ако някой го направи, например (много палав и небрежен):
var iter = yourData.GetEnumerator();
if(iter.MoveNext()) {
Console.WriteLine(iter.Current.Name); // first record of, say, 20
}
// and don't dispose the iterator == bad
тогава, тъй като итераторът не a:се изхвърля, b:се изтощава и c:не се срива, той няма да се изключи правилно (някое от тези 3 условия ще затворете го правилно). Акцент:това е патологичен случай:обикновено е разумно безопасно да се каже „ще затвори, да“.
Ако искате гарантирано небуфериране, имайте предвид, че "dapper" има това, ако зададете buffered
на false
:
IEnumerable<Customer> customers = connection.Query<Customer>(
"select * from Customer", buffered: false);
(може също да обработва параметрите и т.н.)