Оператор LIKE в FromSqlInterpolated/FromSqlRaw не работает, но свободные выражения API или LINQ работают.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Оператор LIKE в FromSqlInterpolated/FromSqlRaw не работает, но свободные выражения API или LINQ работают.

Сообщение Anonymous »

Я знакомлюсь с EF Core в .NET 3.1. У меня есть следующий фрагмент кода:

Код: Выделить всё

public static async Task getWithName(HttpContext c) {
var name = c.Request.RouteValues["name"].ToString();

// with API - WORKS!
var authors = await DB.Authors.Where(a => a.first_name.Contains(name)).ToListAsync();
// with raw SQL interpolated - BROKEN
var authors2 = await DB.Authors.FromSqlInterpolated($"SELECT * FROM author WHERE first_name like '%{name}%'").ToListAsync();
// with raw SQL parametrized - BROKEN
var authors3 = await DB.Authors.FromSqlRaw("SELECT * FROM author WHERE first_name like '%{0}%'", name).ToListAsync();
// with LINQ expressions - WORKS!
var authors4 = await (from a in DB.Authors where a.first_name.Contains(name) select a).ToListAsync();

c.Response.ContentType = "application/json";
return c.Response.WriteAsync(Serialize(authors));
}
Помимо отсутствующего контекста вокруг этого метода, меня смущает то, что и версия Fluent API, и версия выражения запроса LINQ работают должным образом, возвращая 12 элементов в БД. .
Напротив, как интерполированный, так и необработанный SQL не возвращают 0 элементов.

Пожалуйста, имейте в виду: дело не в том, что я получаю исключение или какую-либо ошибку. Они просто возвращают 0 результатов, как будто запрос был неправильным.

Чтобы провести необработанный тест, я просто поставил точку останова и скопировал имя значение и выполнил запрос прямо в pgAdmin. Запрос работает должным образом, возвращая те же 12 элементов.

Это (довольно сложный) результат отладки четырех запросов, которые вы видите в коде:

Код: Выделить всё

#this is the DB init debug output

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 3.1.4 initialized 'AuthorContext' using provider
'Npgsql.EntityFrameworkCore.PostgreSQL' with options: None

#this is the fluent API query, which works

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (14ms) [Parameters=[@__name_0='?'], CommandType='Text', CommandTimeout='30']
SELECT a.id, a.first_name, a.last_name, a.nationality
FROM public.author AS a
WHERE (@__name_0 = '') OR (STRPOS(a.first_name, @__name_0) > 0)

#this is the raw SQL, which fails

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (7ms) [Parameters=[p0='?'], CommandType='Text', CommandTimeout='30']
SELECT * FROM author WHERE first_name like '%@p0%'

#this is the interpolated SQL, which fails too

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (5ms) [Parameters=[p0='?'], CommandType='Text', CommandTimeout='30']
SELECT * FROM author WHERE first_name like '%@p0%'

#this is the LINQ expression query, which works

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (1ms) [Parameters=[@__name_0='?'], CommandType='Text', CommandTimeout='30']
SELECT a.id, a.first_name, a.last_name, a.nationality
FROM public.author AS a
WHERE (@__name_0 = '') OR (STRPOS(a.first_name, @__name_0) > 0)
Я вижу, что версия LINQ/Fluent транслируется в довольно странный SQL, который я не могу понять, но, к сожалению, я также не понимаю, почему код не расширяется правильно мой параметр в необработанном/интерполированном SQL.

Спасибо за любую подсказку!

Подробнее здесь: https://stackoverflow.com/questions/622 ... t-api-or-l
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»