Я хочу сделать потенциально очень большую вставку в моей базе данных на основе других данных из моей базы данных. Вопросы производительности в этом приложении, и даже использование 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 не имеет понятия, как с ним справиться). Итак, в конечном счете, это приемлемый путь, а если нет, есть ли жизнеспособные альтернативы?
сколько данных вы говорите? сотни? тысячи? миллионы? – Fran
@Fran Реально, в диапазоне от десятков тысяч до миллионов. Первый раз, когда он запускается, может быть десятки миллионов, хотя я не ожидаю, что он будет таким большим на регулярной основе. – LightToTheEnd
Вы можете добиться этого только путем написания хранимой процедуры. Не ожидайте, что какое-либо безопасное приложение .Net сможет управлять данными (т. Е. Содержимым памяти), которое оно не имеет. Во всяком случае, «Entity Framework» и «fast» - это противоречие в терминах. –