Я бы хотел добавить кое-что к ответу Судханшу Сингха: он работает очень хорошо, но если у вас есть более сложные структуры, объедините его с объявлением таблицы.
Я успешно использовал следующее (поместите егов самом начале сохраненной процедуры):
CREATE PROCEDURE [EY].[MyStoredProc]
AS
BEGIN
SET NOCOUNT ON;
IF (1=0)
BEGIN
SET FMTONLY OFF
BEGIN
-- declaration + dummy query
-- to allow EF obtain complex data type:
DECLARE @MyStoredProcResult TABLE(
ID INT,
VendorName VARCHAR(255),
ItemName VARCHAR(255),
Type VARCHAR(2),
Sequence TINYINT
);
SELECT * FROM @MyStoredProcResult WHERE (1=0)
END
END
-- your code follows here (SELECT ... FROM ...)
-- this code must return the same columns/data types
--
-- if you require a temp table / table variable like the one above
-- anyway, add the results during processing to @MyStoredProcResult
-- and then your last statement in the SP can be
-- SELECT * FROM @MyStoredProcResult
END
Обратите внимание , что 1=0
гарантирует, что он никогда не будет выполнен, но EF вычитает структуру из него.
После сохранения вашей хранимой процедуры откройте файл EDMX в Visual Studio, обновите модель данных, перейдите в браузер модели Entity Frameworks.В браузере модели найдите свою хранимую процедуру, откройте диалоговое окно «Редактировать импорт функций», выберите «Возвращает коллекцию ... сложных», затем нажмите кнопку «Получить информацию столбца».
Этодолжна показать структуру, как определено выше.Если это так, нажмите «Создать новый сложный тип», и он создаст его с именем хранимой процедуры, например, «MyStoredProc_Result» (с добавлением «_Result»).
Теперь вы можете выбрать его в выпадающем списке «Возвращает коллекцию ... Комплекс» в том же диалоговом окне.
Когда вам нужно что-то обновить, сначала обновите SP, а затемможете вернуться в диалоговое окно «Редактировать функцию импорта» и нажать кнопку «Обновить» (вам не нужно заново создавать все с нуля).