ASP.NET Core + Entity Framework Core の組み合わせで、ストアドプロシージャ内でSelectした結果が0件になるというバグに遭遇しました 。
実行するSQL文を、FromSql()実行前に生成しておくと解消する。
ストアドプロシージャ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
CREATE PROCEDURE [clt].[spKeyword_Select] @SearchWord [nvarchar](100) AS BEGIN SELECT Top 100 [No] as Id, [Word] FROM [mst].[tKeyword] WHERE Word like '%' + @SearchWord + '%' END |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
CREATE PROCEDURE [clt].[spKeyword_Select] @SearchWord [nvarchar](100) AS BEGIN SELECT Top 100 [No] as Id, [Word] FROM [mst].[tKeyword] WHERE Word like '%' + @SearchWord + '%' END |
C#
// 実行結果:0件
1 2 3 4 5 |
var a = context.Keyword .FromSql("EXECUTE clt.spKeyword_Select '{0}'", "a") .ToList(); |
// 実行結果:0件
1 2 3 4 5 |
var b = context.Keyword .FromSql($"EXECUTE clt.spKeyword_Select '{"a"}'") .ToList(); |
// 実行結果:100件
1 2 3 4 5 |
var c = context.Keyword .FromSql("EXECUTE clt.spKeyword_Select 'a'") .ToList(); |
// 実行結果:100件
1 2 3 4 5 6 |
string para = $"EXECUTE clt.spKeyword_Select '{"a"}'"; var d = context.Keyword .FromSql(para) .ToList(); |
ただ、SQL文のパラメータをstringで渡すとSQLインジェクションの問題が発生するので、実質はSqlParameter()を使って渡すやり方しかない。
// 実行結果:100件
1 2 3 4 5 6 |
var paraSearchWord = new SqlParameter("SearchWord", "a"); var e = context.Keyword .FromSql("EXECUTE clt.spKeyword_Select @SearchWord", paraSearchWord) .ToList(); |
環境
・Windows 10
・Visual Studio 2017 15.9.11
・ASP.NET Core 2.2
・Entity Framework Core 2.2
・Microsoft SQL Server 2017 (RTM-CU13) 14.0.3048.4 (X64)
参考
https://docs.microsoft.com/ja-jp/ef/core/querying/raw-sql
コメント