实体框架 4 - 使用 TVP 参数执行存储查询



我的数据库中有一个存储过程,它采用表值参数,即包含单个整数 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();

这将运行并且不返回任何结果,而它应该返回一堆 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

如果我将存储过程声明为

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

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

所以,看起来我想在运行 ExecuteStoreCommand 时使用 EXEC 而不是SP_EXECUTESQL。给定上面的代码示例,我到底该怎么做?

事实证明,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);

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

相关内容

  • 没有找到相关文章

最新更新