ASP.NET Core + Entity Framework Core の組み合わせで、ストアドプロシージャ内でSelectした結果が0件になるというバグに遭遇しました 。
実行するSQL文を、FromSql()実行前に生成しておくと解消する。
ストアドプロシージャ
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件
var a = context.Keyword
.FromSql("EXECUTE clt.spKeyword_Select '{0}'", "a")
.ToList();
// 実行結果:0件
var b = context.Keyword
.FromSql($"EXECUTE clt.spKeyword_Select '{"a"}'")
.ToList();
// 実行結果:100件
var c = context.Keyword
.FromSql("EXECUTE clt.spKeyword_Select 'a'")
.ToList();
// 実行結果:100件
string para = $"EXECUTE clt.spKeyword_Select '{"a"}'";
var d = context.Keyword
.FromSql(para)
.ToList();
ただ、SQL文のパラメータをstringで渡すとSQLインジェクションの問題が発生するので、実質はSqlParameter()を使って渡すやり方しかない。
// 実行結果:100件
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)
参考
最近のコメント