2015-07-29 2 views
0

Как я могу выполнить поиск LIKE с сущностью framework 6 и npgsql?выполнить LIKE-поиск с каркасом сущности и npgsql

Я попытался

1. SQLMethods.Like

queryable.Where(entity => SqlMethods.Like(entity.Name, "%EW%6%")); 

, но я получил сообщение

LINQ к Entities не распознает метод «Логическое Like (System.String , System.String) ', и этот метод не может быть переведен в выражение хранилища.


2. Метод расширения LINQ

Затем я попробовал метод расширения LINQ WhereLike из этого StackOverflow поста: https://stackoverflow.com/a/27153779/1489968

Это работает, но не для всех случаев, потому что это разрезание поиск строки на несколько частей.

queryable.WhereLike(t => t.Name, "%EW%6%")); 

превращается в два и соединенных Contains вызовов, которые трансформируются в двух LIKE выражений.

SELECT ... 
WHERE ... AND 
("Extent1"."name" LIKE E'%EU%' AND "Extent1"."name" LIKE E'%6%') 

что означает «Все объекты с именем, содержащий„ЕС“и„6“»

Но я хочу, чтобы трансформация в результате запроса, как следующий:

SELECT ... 
WHERE ... AND 
("Extent1"."name" LIKE E'%EW%6%') 

, что означает «Все объекты с названием« ЕС », за которым следует строка, содержащая« 6 »«

+0

не на 100% уверен в этом, но я думаю, что потребуется некоторая конкретная поддержка в провайдере Npgsql EF6, которого в настоящее время нет. Не могли бы вы открыть вопрос об этом (github.com/npgsql/npgsql)? Не уверен, что мы скоро приступим к этому, но ... –

ответ

0

Вы можете достичь той же цели, используя Regex.IsMatch().

E.g. один из модульных тестов из Npgql repository:

[Fact] 
public virtual void Regex_IsMatchOptionsNone() 
{ 
    AssertQuery<Customer>(
     cs => cs.Where(c => Regex.IsMatch(c.CompanyName, "^A", RegexOptions.None)), 
     entryCount: 4); 
    Assert.Contains("WHERE \"c\".\"CompanyName\" ~ ('(?p)' || '^A')", Sql); 
} 

Так что я верю в вашем случае это будет выглядеть примерно так:

var pattern = ".*" + Regex.Escape("EW") + ".*" + Regex.Escape("6") + ".*"; 
queryable.Where(t => Regex.IsMatch(t.Name, pattern)); 
+0

Тесты находятся в папке 'EntityFramework7'. Я предполагаю, что эта функция поддерживается только, если вы используете EF7 или !? –

+0

Да, отображение регулярных выражений является функциональным инструментом только в (экспериментальном) поставщике EF7. –