最近、EF Core 2.2 から EF Core 3.0 に移行しました。
残念ながら、エンティティを返すストアド プロシージャを呼び出す方法が見つかりませんでした。
EF Core 2.0 では次のことが可能でした:
var spParams = new object[] { "bla", "xx" };
var createdPath = ModelContext.Paths.FromSql("AddNodeWithPathProc @p0, @p1", spParams).Single();
EF Core 3.0 では、 メソッドFromSQL
は に置き換えられましたFromSqlRaw
。ただし、ストアド プロシージャを正常に呼び出して値を処理することはできませんでした。これは、ストアド プロシージャがデータベースにデータを挿入する場合に役立ちます。
したがって、EF Core 3.0 では次のコードを使用します。
var createdPath = ModelContext.Paths.FromSqlRaw("AddNodeWithPathProc @p0, @p1", spParams).Single();
ただし、生成された SQL が無効であり、次のようなものになるため、例外がスローされます。
exec sp_executesql N'SELECT TOP(2) [p].[PathId], [p].[Level], [p].[NodeId], [p].[NodePath], [p].[NodePathString]
FROM (
@sql @p0, @p1
) AS [p]',N'@p0 nvarchar(4000),@p1 nvarchar(4000), @sql nvarchar(100)',@p0=N'1a',@p1=N'', @sql=N'AddNodeWithPathProc'
いろいろなバリエーションを試してみましたが、成功しませんでした。
ではストアド プロシージャを実行できないのではないかと考え始めていますModelContext.[IQueryable].FromSqlRaw
。私の意見では、この種類は の主な理由の 1 つに反します。FromSqlRaw
通常の選択ステートメントでは、LINQ で十分だからです。
EF Core 3.0でストアド プロシージャを組み合わせて使用する方法をご存知の方はいらっしゃいますかFromSqlRaw
? ご協力いただければ幸いです。
前もって感謝します
PS: を使用してストアド プロシージャを実行できることは知っていますthis.Database.ExecuteSqlRaw(SQL, parameters)
。ただし、その方法では、ストアド プロシージャがクエリするエンティティを取得することはできません。
ベストアンサー1
解決策 (David Browne に感謝します。回答として投稿するべきでした):
Single を ToList に置き換えると動作します :-)
var createdPath = ModelContext.Paths.FromSqlRaw("AddNodeWithPathProc {0}, {1}", nodeTitle, parentPathString).ToList();