Что LINQ к объектам 'где' пункт, делающий негласно?

Если по какой-либо причине необходимо инициировать события Eloquent, и вы хотите оптимизировать проблему n + 1, я бы предложил использовать транзакцию. Это все равно выдаст n запросов, но база данных может оптимизировать это посредством массовой вставки (из-за транзакции). Он обладает дополнительным преимуществом согласованности данных (либо все вставки выполняются успешно, либо ни одна из них не выполняется).

$result = getResult();

\DB::transaction(function() use ($result) {
    foreach($result as $item) {
        FieldRuleResult::create($item);
    }
});

Если вас не волнует запуск событий Eloquent, и вы просто хотите «массово вставить», вы можете использовать метод insert, как упомянул Фабиан. Тем не менее, я бы посоветовал использовать транзакцию базы данных для согласованности данных.

$result = getResult();

\DB::transaction(function() use ($result) {
    FieldRuleResult::insert($result);
});

В этом последнем случае, если количество записей, которые вы собираетесь вставить, может быть «большим», вы также можете разделить эти вставки на части. (например, 100 за раз, а не все сразу)

5
задан Trap 19 March 2009 в 22:40
поделиться

3 ответа

yield return ключевое слово и лямбды действительно включают создание скрытых классов во время компиляции и выделение дополнительных объектов во времени выполнения, и если Ваше образование находится в C или C++ затем, только естественно касаться производительности.

Естественный, но неправильно!

Я попытался измерить издержки для лямбд с закрытием по локальным переменным и нашел, что это было так невероятно маленьким (вопрос наносекунд), что это не будет иметь значения почти во всех приложениях.

6
ответ дан 14 December 2019 в 01:17
поделиться

Это зависит от типа если m_sources.

Если это - Контекст Данных от LINQ до SQL или Платформы Объекта аргумент, Вы передаете, компилируется как экземпляр Выражения и анализируется для создания SQL (с помощью модели данных). Существуют некоторые реальные затраты в этом процессе, но вероятно (в большинстве случаев) быть во власти распространения в прямом и обратном направлениях к базе данных.

Если это - IEnumerable затем, Где в значительной степени реализован как:

public static IEnumnerable<T> Where(this IEnumerable<T> input, Func<T, bool> predicate) {
  foreach (var v in input) {
    if (predicate(v)) {
      yield return v;
    }
  }
}

Который довольно эффективен и работает лениво (поэтому, если Вы убежите из своего цикла рано, то предикат не будет применен к целому набору).

2
ответ дан 14 December 2019 в 01:17
поделиться

В основном, да, это - то же, O (n).

Где пункт будет выполняться, в то время как Вы циклично выполняетесь через свой список (т.е. если Вы повреждаетесь после первого объекта, следующие объекты не будут протестированы).

1
ответ дан 14 December 2019 в 01:17
поделиться
Другие вопросы по тегам:

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