Почему NpgsqlParameter не работает при передаче в DbSet.FromSqlRaw

Sep 03 2020

Как я уже упоминал в заголовке, DbSet.FromSqlRawне работает, когда я прохожу мимо NpgsqlParameter. Я всегда получаю ноль.

Вот несколько вариантов, которые я пробовал:

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-запрос (точнее, сохраняю его для аудита), а вторая причина в том, что я знаю, что NpgsqlParameterSQL-инъекция также безопасна.

Ответы

2 fuzzy_logic Sep 04 2020 at 13:31

Извините, я не могу сейчас проверить точный синтаксис, но как насчет чего-то вроде:

    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. Если да, объясните, почему вы видите ошибку о необходимости использовать NpgsqlParameter вместо SqlParameter.