Linq to Sql - возврат IEnumerable без использования списков [duplicate]

Если вы используете TortoiseGit, вы можете использовать функцию Combine to one commit:

  1. Открыть контекстное меню TortoiseGit
  2. Выбрать Show Log
  3. Отметить
  4. Эта функция автоматически выполняется все необходимые одиночные шаги git. К сожалению, доступно только для Windows.

5
задан net_prog 17 February 2012 в 10:03
поделиться

3 ответа

В случае выполнения базового запроса он может работать таким образом (конечно, это возможно) - однако, в случае запроса голого 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);

(он также может обрабатывать параметры и т. д.)

3
ответ дан Marc Gravell 31 August 2018 в 13:27
поделиться
  1. Итератор будет лениво оценен. Он вытащит первый элемент, а затем «уступит» его потребителю. Влияние производительности будет зависеть от того, как реализован LinqDataContext (он может кэшировать материал внутри компании). Использование ToArray () или ToList () заставит все элементы из LinqDataContext перед продолжением. Поэтому использование ToArray () приведет к тому, что вы ничего не получите до тех пор, пока LinqDataContext не вернет каждый элемент. Оптимальное или нет, зависит от вас.
  2. Да, «использование» будет выполнено правильно.
2
ответ дан Jeff Bridgman 31 August 2018 в 13:27
поделиться

1) yield не обязательно будет быстрее получать все значения, но это позволит коду начать обработку результатов до того, как база данных вернет все результаты. То есть, доход возвращает первый результат в момент его появления, а ToArray () должен ждать появления всех результатов перед возвратом. Конечно, если базовые поставщики сразу возвращают все результаты из-за буферизации или по другим причинам, это может не повлиять.

2) Да, using будет избавляться от LinqDataContext независимо от того, как вы выходите блок использования (исключения / return / break /...)

3
ответ дан Joachim Isaksson 31 August 2018 в 13:27
поделиться
Другие вопросы по тегам:

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