带有TVP参数的ExecuteStoreQuery

Col*_*ond 5 entity-framework-4 executestorequery

我的数据库中有一个存储过程,它接受一个表值参数,一个包含单个整数Id列的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();
Run Code Online (Sandbox Code Playgroud)

当它应该返回一堆ProjectSummary实体时,它会运行并且不返回任何结果.

当我在SQL事件探查器中对此进行分析时,我得到以下内容

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
Run Code Online (Sandbox Code Playgroud)

如果我声明存储过程

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
...
Run Code Online (Sandbox Code Playgroud)

然后我得不到结果,看起来TVP参数是空的.

好像我手动执行的地方

declare @p3 IdTable
insert into @p3 values(N'1')
insert into @p3 values(N'2')

EXEC    [ProjectSummary]
        @stationIds = @p3

GO
Run Code Online (Sandbox Code Playgroud)

我从SELECT查询返回值1和2.

因此,当我运行ExecuteStoreCommand时,看起来我想使用EXEC而不是SP_EXECUTESQL.鉴于上面的代码示例,我该怎么做呢?

Col*_*ond 9

结果是ExecuteStoreQuery调用不正确,应该是

SqlParameter stations = new SqlParameter { ParameterName = "p0", Value = ids, TypeName = "[dbo].[IdTable]", SqlDbType = SqlDbType.Structured };

var parameters = new object[] { stations };

var results = projectEntities.ExecuteStoreQuery<ProjectSummary>("exec ProjectSummary @p0", parameters);
Run Code Online (Sandbox Code Playgroud)

所以我需要命名参数并将@ p0添加到exec命令.