Por que NpgsqlParameter não está funcionando quando passado para DbSet.FromSqlRaw
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
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.