2

Я хочу сделать потенциально очень большую вставку в моей базе данных на основе других данных из моей базы данных. Вопросы производительности в этом приложении, и даже использование SqlBulkCopy замедляет этот процесс слишком много для моей симпатии.Использование Entity Framework для выполнения команд в базе данных

Итак, вопрос: можно ли использовать Linq для EF для автоматического создания и запуска SQL-кода в базе данных, никогда ничего не возвращающего пользователю? Казалось бы, мне кажется, я просто понятия не имею, как обойти это.

Это предпосылка: может ли что-то вроде следующего работать?

myContext.OutputTable.AddRange(
    myContext.TableA.Join(
     myContext.TableB, 
     a => a.myAKey, 
     b => b.myBKey, 
     (a, b) => new { a.fieldA, a.fieldB, b.fieldC }).Select(
    output => new OutputTable 
    { 
     myOutputColumnA = output.FieldA, 
     myOutputColumnB = output.FieldB, 
     myOutputColumnC = output.FieldC 
    }) 
); 

Возможно, то, что я пытаюсь сделать здесь, не очевидно. Я в основном пытаюсь вставить данные в «OutputTable», используя данные из таблиц A и TableB, не позволяя EntityFramework возвращать данные в приложение. Теперь я знаю, что можно использовать ExecuteNonQuery() для запуска такого типа инструкции вставки, но в конечном итоге я не хочу этого делать по нескольким причинам: я хочу, чтобы мы сохранили весь код на C#; Я также хочу сохранить отладочный аспект, который предлагает Linq (поскольку я использую Visual Studio, это помогает сбой запроса в том же месте, что и код).

Я знаю, что Linq to EF генерирует SQL, который выполняется в базе данных, поэтому мне представляется возможным выполнить это (возможно, придется целенаправленно игнорировать ленивую загрузку, поэтому код действительно выполняется). Вышеприведенный код не выполняется, я полагаю, исходя из предположения, что новый объект не может быть создан внутри оператора Select() таким образом (Linq to EF не имеет понятия, как с ним справиться). Итак, в конечном счете, это приемлемый путь, а если нет, есть ли жизнеспособные альтернативы?

+0

сколько данных вы говорите? сотни? тысячи? миллионы? – Fran

+0

@Fran Реально, в диапазоне от десятков тысяч до миллионов. Первый раз, когда он запускается, может быть десятки миллионов, хотя я не ожидаю, что он будет таким большим на регулярной основе. – LightToTheEnd

+0

Вы можете добиться этого только путем написания хранимой процедуры. Не ожидайте, что какое-либо безопасное приложение .Net сможет управлять данными (т. Е. Содержимым памяти), которое оно не имеет. Во всяком случае, «Entity Framework» и «fast» - это противоречие в терминах. –

ответ

1

Вы не будете получать быстрее, чем SqlBulkCopy, используя EF. EntityFramework - это ORM, поэтому, даже если вы отключите все возможные варианты, он все равно будет медленнее, чем SqlBulkCopy, потому что он хочет взять эти необработанные данные sql и материализовать объекты.

SqlBulkCopy - это как открытие пожарной базы в базе данных. он отключит противопоказания и использует другой механизм, который регулярно записывается в db.

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

Вот старый, но хорошее объяснение SqlBulkCopy здесь

http://www.sqlbi.com/wp-content/uploads/SqlBulkCopy-Performance-1.0.pdf