Perché NpgsqlParameter non funziona quando viene passato a DbSet.FromSqlRaw
Come ho detto nel titolo, DbSet.FromSqlRawnon funziona quando passo NpgsqlParameter. Ottengo sempre zero.
Ecco alcune varianti che ho provato:
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();
Prima che qualcuno chieda "Perché non usi stringhe interpolate inline?" come questo.
FromSqlRaw($"SELECT * FROM \"Admin\".\"User\" as usr WHERE \"usr\".\"Value\" = {value}");
Il primo motivo è che sto riutilizzando quella query sql (per essere più precisi, salvandola per l'audit) e la seconda ragione è che sono consapevole che NpgsqlParameterè anche sicuro per SQL injection.
Risposte
Mi spiace, non posso controllare la sintassi esatta in questo momento, ma che ne dici di qualcosa come:
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();
C'è un esempio end-to-end qui .
Tuttavia, sembra che tu stia usando Postgres. In caso affermativo, spiega perché viene visualizzato l'errore relativo alla necessità di utilizzare NpgsqlParameter invece di SqlParameter.