Я использую Entity Framework с С# для создания приложения Silverlight. Я написал несколько хранимых процедур, которые выполняют интенсивные операции с базой данных, и мне нужно вызвать их из Entity Framework после передачи некоторых параметров. На одном из этапов пользователи выбирают список элементов, для которых им потребуется дополнительная информация. Этот список элементов (в виде массива целочисленных идентификаторов) необходимо передать хранимой процедуре для получения дополнительной информации об этих идентификаторах. Как передать этот параметр хранимой процедуре?
Передача массива/таблицы хранимой процедуре через Entity Framework
Ответ 1
Вы не можете передавать табличные параметры в SQL с помощью Entity Framework.
Что вы можете сделать, так это создать строку с разделителями типа "1|2|3|4"
и создать в SQL команду Split, которая вернет таблицу.
CREATE FUNCTION dbo.Split
(
@RowData nvarchar(2000),
@SplitOn nvarchar(5)
)
RETURNS @RtnValue table
(
Id int identity(1,1),
Data nvarchar(100)
)
AS
BEGIN
Declare @Cnt int
Set @Cnt = 1
While (Charindex(@SplitOn,@RowData)>0)
Begin
Insert Into @RtnValue (data)
Select
Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))
Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
Set @Cnt = @Cnt + 1
End
Insert Into @RtnValue (data)
Select Data = ltrim(rtrim(@RowData))
Return
END
Затем, если вам нужно сделать что-то вроде выбора всех элементов из таблицы на основе того, что находится в разделительной строке, переданной вашему proc:
SELECT * FROM SomeTable WHERE Id IN (SELECT Id FROM dbo.Split(@DelStr, '|'))
Ответ 2
Если вы используете SQL Server, который, как я полагаю, имеет место, вы можете создать параметр table value, чтобы сделать то, что вы хотите. Использование параметра, оцененного по таблице, не позволяет вам анализировать входной параметр в хранимой процедуре и удаляет угрозу атаки SQL-инъекции, устраняя использование динамического SQL.
Вот отличная статья в блоге, в которой рассказывается, как делать то, что вы хотите сделать.
Ответ 3
Является этим, что вы искали?