Dlaczego parametr NpgsqlParameter nie działa po przekazaniu do DbSet.FromSqlRaw

Sep 03 2020

Jak wspomniałem w tytule, DbSet.FromSqlRawnie działa, kiedy zdaję NpgsqlParameter. Zawsze otrzymuję zero.

Oto kilka odmian, które wypróbowałem:

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

Zanim ktoś zapyta „Dlaczego nie używasz wbudowanych interpolowanych łańcuchów?” lubię to.

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

Pierwszym powodem jest to, że ponownie używam tego zapytania sql (a dokładniej zapisuję go do audytu), a drugim powodem jest to, że wiem, że NpgsqlParameterjest to również bezpieczne wstrzyknięcie SQL.

Odpowiedzi

2 fuzzy_logic Sep 04 2020 at 13:31

Przepraszamy, nie mogę teraz sprawdzić dokładnej składni - ale co powiesz na coś takiego:

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

Tam jest koniec-koniec przykład tutaj .

Jednak wygląda na to, że używasz Postgres. Jeśli tak, wyjaśnij, dlaczego widzisz błąd dotyczący konieczności użycia NpgsqlParameter zamiast SqlParameter.