データベースに、テーブル値パラメーター、単一の整数 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 を実行するときに、SP_EXECUTESQL ではなく EXEC を使用したいようです。上記のコード例を考えると、いったいどうすればいいのでしょうか?