Временные таблицы Entity Framework и SQL Server

У нас есть устаревшее приложение, которое мы переносим на C#, и я хотел бы использовать Entity Framework (EF) для доступа к данным. SQL Server 2012 — это база данных, и в настоящее время я использую EF 5.0. Исходное приложение выполняло много интенсивной обработки данных. В рамках этой обработки исходное приложение широко использовало "временные" таблицы. Большинство этих «временных» таблиц на самом деле не были временными таблицами SQL Server (например, #sometable в базе данных tempdb), а были настоящими таблицами, созданными и уничтоженными в собственной «временной» базе данных в SQL Server.

Теперь, когда я работаю с C# EF, я хочу иметь возможность использовать временные таблицы (любого типа) как часть обработки данных. Я немного погуглил об использовании временных таблиц с EF - и до сих пор я обнаружил, что вы можете создавать временные таблицы tempdb с помощью SQLBulkCopy, но нет никакого способа сделать запрос к ним с помощью EF Linq, поскольку они не являются частью нормальная структура данных. Другой вариант, о котором я читал, - это использование хранимой процедуры для обработки и передачи ей табличного параметра. Это заставит нас иметь тысячи хранимых процедур и поместить большую часть бизнес-логики в sprocs.

Есть ли другой способ создания и использования временных таблиц SQL Server? Есть ли в EF 6 дополнительные возможности в этой области?


person Clinemi    schedule 03.02.2014    source источник
comment
Вы можете настроить другой контекст EF для временной базы данных. Хотя вы не могли уничтожить их после использования и должны были полагаться на очистку этих таблиц, самый быстрый способ через sprocs.   -  person James Sampica    schedule 04.02.2014
comment
Если вы загружаете кучу записей в память с помощью EF, это, по сути, временная таблица, за исключением того, что в вашем распоряжении нет всех преимуществ механизма базы данных. Вопрос в том, сколько данных, о которых мы говорим, обычно помещается в одну из этих временных таблиц?   -  person Eric Scherrer    schedule 04.02.2014
comment
Да, EF может дать мне что-то вроде временной таблицы в памяти, но у нас часто бывает (например) то, что нам нужно получить меню элементов, связанных с конкретным клиентом. А затем вне этой временной таблицы нам нужно найти цены, наличие, даты последнего счета и т. Д. - для каждого из этих пунктов в меню. С EF мне приходится выполнять индивидуальный поиск каждого из этих элементов в таблицах SQL Server. Вместо этого, если я могу использовать временную таблицу SQL Server для одновременного выполнения запросов ко всем этим элементам, производительность будет намного лучше.   -  person Clinemi    schedule 04.02.2014


Ответы (1)


Я никогда не видел временные таблицы, используемые в EF.

Если рассматриваемый процесс данных настолько интенсивен, вероятно, лучше оставить его как хранимую процедуру (я предполагаю, что так работал устаревший код). EF может без проблем запускать хранимые процедуры; вы даже можете получить результаты обратно в виде объекта модели.

Если вы действительно не хотите использовать хранимую процедуру, вы также можете смоделировать временную таблицу в EF, используя обычную таблицу и просто отфильтровав ее для текущего сеанса (с помощью GUID или другого одноразового синтетического ключа). ). Этот метод работает довольно хорошо, но имеет недостаток, заключающийся в том, что после завершения процедуры необходимо очистить таблицу от мусора.

person Ash8087    schedule 03.02.2014
comment
Фактически, устаревшее приложение использовало как временные таблицы в памяти, временные таблицы сервера sql, так и (иногда) хранимые процедуры. Бизнес-логика была в основном в коде, но для промежуточной обработки использовались временные таблицы — так же, как вы делали бы с подзапросом или общим табличным выражением. Однако в какой-то момент запросы становятся сложными, и их необходимо разбить на отдельные запросы (например, временные таблицы). - person Clinemi; 04.02.2014
comment
Фильтрация существующей таблицы не соответствует нашим потребностям, потому что наши временные таблицы редко имеют ту же структуру, что и постоянные таблицы. - person Clinemi; 04.02.2014
comment
Судя по вашему ответу, мне придется либо отказаться от EF, либо поместить большую часть бизнес-логики в хранимые процедуры. - person Clinemi; 04.02.2014