Perché NpgsqlParameter non funziona quando viene passato a DbSet.FromSqlRaw

Sep 03 2020

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

2 fuzzy_logic Sep 04 2020 at 13:31

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.