Por que NpgsqlParameter não está funcionando quando passado para DbSet.FromSqlRaw

Sep 03 2020

Como mencionei no título, DbSet.FromSqlRawnão funciona quando passo NpgsqlParameter. Eu sempre fico nulo.

Aqui estão algumas variações que tentei:

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();

Antes que alguém pergunte "Por que você não usa strings interpoladas embutidas?" como isso.

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

A primeira razão é porque estou reutilizando aquela consulta sql (para ser mais preciso, salvando-a para auditoria) e a segunda razão é que estou ciente de que NpgsqlParametertambém é segura para injeção de SQL.

Respostas

2 fuzzy_logic Sep 04 2020 at 13:31

Não consigo verificar a sintaxe exata agora - mas que tal algo como:

    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();

Há um exemplo de ponta a ponta aqui .

No entanto, parece que você está usando o Postgres. Em caso afirmativo, explica por que você está vendo o erro sobre a necessidade de usar NpgsqlParameter em vez de SqlParameter.