У меня есть хранимая процедура в моей базе данных, которая принимает параметр табличного значения, список объектов IdTable, которые содержат один столбец целочисленного идентификатора.
У меня есть модель сущности для базы данных, и я хочу выполнитьследующий ...
ProjectEntities projectEntities = new ProjectEntities ();
DataTable stationIds = new DataTable();
stationIds.Columns.Add("Id");
stationIds.Rows.Add(1);
stationIds.Rows.Add(2);
SqlParameter parameter = new SqlParameter("@stationIds",stationIds);
parameter.TypeName = "IdTable";
var parameters = new object[] {parameter};
var results = projectEntities .ExecuteStoreQuery<ProjectSummary>("exec ProjectSummary", parameters);
var count = results.Count();
Это выполняется и не возвращает результатов, когда он должен вернуть кучу сущностей ProjectSummary.
Когда я профилирую это в SQL Profiler, я получаю следующее
declare @p3 IdTable
insert into @p3 values(N'1')
insert into @p3 values(N'2')
exec sp_executesql N'exec ProjectSummary',N'@stationIds [IdTable] READONLY',@stationIds=@p3
Если я объявлю хранимую процедуру равной
ALTER PROCEDURE [dbo].[ProjectSummary]
@stationIds [dbo].[IdTable] READONLY
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SELECT * FROM @stationIds
...
Тогда я не получу результатов обратно, похоже, что параметр TVP проходит через пустое значение.
Где какесли я вручную выполню
declare @p3 IdTable
insert into @p3 values(N'1')
insert into @p3 values(N'2')
EXEC [ProjectSummary]
@stationIds = @p3
GO
, я получу значения 1 и 2, возвращенные из запроса SELECT.
Итак, похоже, что я хочу использовать EXEC, а не SP_EXECUTESQL, когда я запускаю ExecuteStoreCommand.Учитывая приведенный выше пример кода, как я могу это сделать?