Предотвратить EF избежать экранирующего символа - PullRequest
2 голосов
/ 18 ноября 2011

У меня есть что-то вроде этого

var query = repo.GetQuery(); // IQueryable
query.Where(item => item.FieldName.Contains("xxx%yyy"));

Это приводит к следующему утверждению на сервере SQL

exec sp_executesql N'SELECT 
// clipped
WHERE ([Extent1].[FieldName] LIKE @p__linq__0 ESCAPE N''~'')',
    N'@p__linq__0 nvarchar(4000),@p__linq__0=N'%xxx~%yyy%'

@p__linq__0=N'%xxx~%yyy% заставляет сервер SQL искать xxx%yyy с % в качестве литерала (поскольку он экранирован), в то время как я хотел бы, чтобы он совпадал со строкой, такой как xxx123yyy, xxxABCyyy, xxxANYTHINGyyy, xxxyyy и т. Д. Добавление prefix % и suffix % хорошо, но я мог бы сделать это вручную, если это необходимо.

В приведенном выше примере я упростил и написал только одно условие, но у меня есть динамическая логика, которая строит предикат со многими из таких ключевых слов, и я хотел бы разрешить использование подстановочных знаков внутри ключевых слов. Есть ли способ сказать EF не избегать% в ключевом слове поиска?

1 Ответ

1 голос
/ 19 ноября 2011

Это невозможно. Contains("xxx") означает, что в SQL вы хотите LIKE '%xxx%'. Linq-to-entity, и ни один из отображенных им методов String не предлагает полный поиск по шаблону = любой символ подстановки всегда экранируется. Если вы хотите использовать поиск по шаблону, вы должны использовать Entity SQL .

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