¿Por qué NpgsqlParameter no funciona cuando se pasa a DbSet.FromSqlRaw?

Sep 03 2020

Como mencioné en el título, DbSet.FromSqlRawno funciona cuando paso NpgsqlParameter. Siempre obtengo nulo.

Aquí hay algunas variaciones que he probado:

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 de que alguien pregunte "¿Por qué no usa cadenas interpoladas en línea?" Me gusta esto.

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

La primera razón es porque estoy reutilizando esa consulta sql (para ser más precisos, guardándola para auditoría) y la segunda razón es que soy consciente de que NpgsqlParametertambién es segura la inyección SQL.

Respuestas

2 fuzzy_logic Sep 04 2020 at 13:31

Lo siento, no puedo verificar la sintaxis exacta en este momento, pero ¿qué 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();

Hay un ejemplo de extremo a extremo aquí .

Sin embargo, parece que estás usando Postgres. Si es así, explica por qué está viendo el error sobre la necesidad de usar NpgsqlParameter en lugar de SqlParameter.