Передача массива/таблицы хранимой процедуре через Entity Framework

Я использую Entity Framework с С# для создания приложения Silverlight. Я написал несколько хранимых процедур, которые выполняют интенсивные операции с базой данных, и мне нужно вызвать их из 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.

Вот отличная статья в блоге, в которой рассказывается, как делать то, что вы хотите сделать.

Использование табличных параметров в SQL Server 2008 и С#

Ответ 3

Является этим, что вы искали?