Фон
У меня есть таблица, содержащая только один столбец: Имя. В нем всего четыре строки, скажем
| Name |
| test1.com |
| test2.com |
| test3.com |
| test4.com |
Проблема
Если я запрошу
var email = "[email protected]";
Table.Where(x => email.EndsWith(x.Name));
Я получу пустой список. но если я сначала запрашиваю все строки и вычисляю Where in memory like this
var email = "[email protected]";
Table.ToList().Where(x => email.EndsWith(x.Name));
Я получу список, содержащий только test2.com, который является правильным.
Сгенерированный SQL для первого запроса
SELECT "Extent1"."Name" AS "Name"
FROM "USER"."Table" "Extent1"
WHERE (( NVL(INSTR(REVERSE(:p__linq__0), REVERSE("Extent1"."Name")), 0) ) = 1)
Я попытался заменить: p__linq__0 на '[email protected]' и запустить запрос в SQLDeveloper, результат правильный.
Дополнительная информация
Если я изменил EndsWith() на Содержит(), проблема исчезнет. Вот сгенерированный SQL для Contains()
SELECT "Extent1"."Name" AS "Name"
FROM "USER"."Table" "Extent1"
WHERE (( NVL(INSTR(:p__linq__0, "Extent1"."Name"), 0) ) > 0)
Есть ли у вас какое-либо представление о том, что не так с методом EndsWith или REVERSE?
Окружающая среда
- EF5.0
- .NET4.5
- Oracle11g
- ODP.NET11.2 Release 3