Если вы используете TortoiseGit, вы можете использовать функцию Combine to one commit
:
В случае выполнения базового запроса он может работать таким образом (конечно, это возможно) - однако, в случае запроса голого Table<T>
, он может , что все буферы сначала; вы могли бы попытаться запросить счет во время итерации или запустить трассировку. В этом случае I подозревает , он сначала будет буферизовать.
Re closed: это также зависит; 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
, тогда, когда итератор не делает: get disposed, b: исчерпает себя, а c: не он не отключится должным образом (любой из этих 3 условий будет правильно закрывать его). Акцент: это патологический случай: обычно разумно безопасно говорить «он будет закрываться, да».
Если вы хотите гарантированную небуферизацию, обратите внимание на то, что «dapper» имеет это, если вы установите buffered
- false
:
IEnumerable<Customer> customers = connection.Query<Customer>(
"select * from Customer", buffered: false);
(он также может обрабатывать параметры и т. д.)
1) yield
не обязательно будет быстрее получать все значения, но это позволит коду начать обработку результатов до того, как база данных вернет все результаты. То есть, доход возвращает первый результат в момент его появления, а ToArray () должен ждать появления всех результатов перед возвратом. Конечно, если базовые поставщики сразу возвращают все результаты из-за буферизации или по другим причинам, это может не повлиять.
2) Да, using
будет избавляться от LinqDataContext независимо от того, как вы выходите блок использования (исключения / return / break /...)