スポンサーリンク

EFCoreで実行したストアドのSelect結果が0件になるバグ

.NET Core

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)

 

参考

生 SQL クエリ - EF Core
Entity Framework Core のクエリに対する生 SQL の使用

コメント

タイトルとURLをコピーしました