Как полностью смоделировать поведение SQL Like в Linq-to-Entities - PullRequest
1 голос
/ 13 июня 2019

Я хочу полностью смоделировать поведение SQL Like в Linq-to-Entities.

Я не хочу использовать StartsWith, EndsWith или Contains, которые не работают должным образом, когда оригиналзапрос:

t_test LIKE '%';

Я также не могу использовать методы Linq-to-SQL в SqlFunctions, потому что я не всегда использую среду SQL поверх Entity (особенно при тестировании моих репозиториев с использованием фиктивного DbContext).

В моем основном случае Entity подключен к базе данных Oracle SQL.

До сих пор я пробовал эту лямбду в своем предложении Where (я использую '*' в качестве escape-символа вместо '%'):

x => (testName.StartsWith("*") && testName.EndsWith("*") &&
                         x.Name.Contains(testName.Replace("*", "")) ||
                         testName.StartsWith("*") &&
                         x.Name.EndsWith(testName.Replace("*", "")) ||
                         testName.EndsWith("*") &&
                         x.Name.StartsWith(testName.Replace("*", ""))))

Сущность перевести этов следующем запросе Oracle SQL:

SELECT 
"Extent1"."KEY" AS "KEY", 
"Extent1"."NAME" AS "NAME", 
FROM "T_NAME" "Extent1"
WHERE ((('*' LIKE '*%') AND ('*' LIKE '%*') AND (( NVL(INSTR("Extent1"."NAME", REPLACE('*', '*', '')), 0) ) > 0)));

, который ничего не возвращает.

Любая подсказка или помощь будут великолепны.

1 Ответ

1 голос
/ 14 июня 2019

Я наконец-то нашел проблему.

На самом деле, похоже, что testName.Replace("*", "") неверно истолковано.При выполнении обработки вне Linq, SQL-запрос, который создается, является правильным, и все работает нормально.

Исправление:

string correctName = testName.Replace("*", "");

x => (testName.StartsWith("*") && testName.EndsWith("*") &&
                         x.Name.Contains(correctName) ||
                         testName.StartsWith("*") &&
                         x.Name.EndsWith(correctName) ||
                         testName.EndsWith("*") &&
                         x.Name.StartsWith(correctName)))

SQL, получаемый из этого:

SELECT
"Extent1"."KEY" AS "KEY", 
"Extent1"."NAME" AS "NAME",
FROM "T_NAME" "Extent1"
WHERE (('*' LIKE '*%') AND ('*' LIKE '%*') AND ("Extent1"."NAME" LIKE "%%" ESCAPE '\'))

Теперь все отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...