C# - DbSet.FromSqlRaw に渡されたときに NpgsqlParameter が機能しないのはなぜですか

okwaves2024-01-25  11

タイトルで述べたように、NpgsqlParameter を渡すと DbSet.FromSqlRaw が機能しません。常に null が返されます。

私が試したいくつかのバリエーションを次に示します。

long value = 3;
NpgsqlParameter npgsqlParameter = new NpgsqlParameter("value", value);
string query = "SELECT * FROM \"Admin\".\"User\" as usr WHERE \"usr\".\"Value\" = '@value'";

var _user = _AdminPanelDbContext
           .User
           .FromSqlRaw(query, npgsqlParameter)
           .FirstOrDefault();
long value = 3;
NpgsqlParameter npgsqlParameter = new NpgsqlParameter("value", value);
string query = "SELECT * FROM \"Admin\".\"User\" as usr WHERE \"usr\".\"Value\" = ':value'";

var _user = _AdminPanelDbContext
           .User
           .FromSqlRaw(query, npgsqlParameter)
           .FirstOrDefault();

誰かが「なぜインライン補間文字列を使用しないのですか?」と尋ねる前に、このように。

FromSqlRaw($"SELECT * FROM \"Admin\".\"User\" as usr WHERE \"usr\".\"Value\" = {value}");

最初の理由は、SQL クエリを再利用しているため (より正確には、監査に保存しているため)、2 番目の理由は、NpgsqlParameter も SQL インジェクションに対して安全であることを認識しているためです。

FromSqlRaW は、プロバイダー固有のオブジェクトではなく、EF パラメーター オブジェクトを使用します。それはこれは、ADO.NET の DbCommand の代替ではなく、基礎となるプロバイダーに対して EF が生の SQL を操作できるようにするメソッドです。 EF Core は、これらのパラメーターを使用してプロバイダー固有のパラメーターを作成します。

– パナギオティス・カナボス

2020 年 9 月 3 日 10:24

1

@PanagiotisKanavos、コメントを理解したかどうかわかりません。すでに SqlParameter を使用しようとしましたが、例外「The value "value"」が発生しました。 「NpgsqlParameter」タイプではありません。のd はこのパラメータ コレクションでは使用できません。」そこで新たな疑問は、Npgsql でパラメータを使用することは可能でしょうか?

– ジェナート

2020 年 9 月 3 日 10:44

1

'@value' 「at」、「v」、「a」、「l」、「u」、「e」の 6 文字を含むリテラルです。 @value (一重引用符なし) は、「value」という名前のパラメータの値を意味します。

– マーク・グラベル

2020 年 9 月 4 日 6:40

@MarcGravell、それは魅力的に機能します !!書式設定可能な補間文字列を使用する場合は、テキスト値を一重引用符で囲む必要があるため、混乱を招きます (Postgresql 構文)。

– ジェナート

2020 年 9 月 4 日 15:03



------------------------

申し訳ありませんが、現時点では正確な構文を確認できませんが、次のようなものはどうでしょうか。

    long value = 3;
    var searchParam = new NpgsqlParameter("value", value);
    var _user = _AdminPanelDbContext.User.FromSqlRaw("select * from admin.user as usr where usr.value = @searchParam;", searchParam).FirstOrDefault();

ここにエンドツーエンドの例があります。

しかし、Postgres を使用しているようですね。 「はい」の場合、経験値SqlParameter の代わりに NpgsqlParameter を使用する必要があるというエラーが表示される理由は次のとおりです。

2020 年 9 月 4 日 6:31 に回答

ファジー_ロジック

ファジー_ロジック

961

11 個

銀バッジ 11 個

14 個

銅バッジ 14 個

4

1

質問: なぜ $"{value}" なのか単なる値ではなく(e値)?文字列の場合は問題ありませんが (非効率的ですが)、文字列以外の型の場合は文字列化されますが、これは必ずしも意図されたものではありません

– マーク・グラベル

2020 年 9 月 4 日 6:41

1

@MarcGravell 正解です!データベースに対して LIKE 条件を実行する例を見ていました。 $"%{search_for_me}%")。修正しました。

– ファジー_ロジック

2020 年 9 月 4 日 6:54

@fuzzy_logic、これは良い例であり、素晴らしいことは、それが機能することです。ちょっとした不満は、FromSqlRaw でのインライン クエリを避けるためだけに質問したということですが、心配する必要はありません。試してみたところ、問題なく動作しました。

– ジェナート

2020 年 9 月 4 日 15:06

1

@Genato 素晴らしいですね、うまくいっていると聞いてうれしいです!もう 1 つのオプションは、FromSqlInterpolated を使用することです。特に文字列補間 vi を使用したい場合$""構文。ドキュメントには、それぞれをいつ使用するかについての適切なメモが記載されています。

– ファジー_ロジック

2020 年 9 月 5 日 7:57

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。