Сделать Entity Framework использовать Contains вместо Like и объяснить «ESCAPE ~»

c# entity-framework-6

Вопрос

У меня есть строка LINQ, которую я использую в EF, которая в основном выполняет myTable.Where(c => c.Contains('mystring'));

Это сгенерированный код:

SELECT TOP (300) 
[Extent1].[ID] AS [ID], 
[Extent1].[FKFishEntityID] AS [FKFishEntityID], 
[Extent1].[Fish] AS [Fish], 
[Extent1].[FishText] AS [FishText], 
[Extent1].[FishType] AS [FishType]
FROM [dbo].[Fish] AS [Extent1]
WHERE [Extent1].[FishText] LIKE @p__linq__0 ESCAPE '~'

Мои два вопроса:

  • Как я могу использовать CONTAINS (...) вместо LIKE? Кажется, что LIKE очень медленно, когда в таблице используется полнотекстовая индексация. Копирование и вставка запроса занимает 4 секунды, но если я изменил LIKE на CONTAINS (), он будет выполняться мгновенно.

  • Почему это делает ESCAPE '~'? Скопировав + вставку на сервер SQL, он выполняется примерно в 4 раза быстрее, если я удалю часть «ESCAPE».

Принятый ответ

из блога структуры [entity framework]: 1

На данный момент нет встроенной поддержки полнотекстового поиска. Вам нужно будет использовать необработанный SQL-запрос.

Кажется, что путь - это что-то вроде этого:

using (var context = new BloggingContext())
{
    var fishes = context.Fishes.SqlQuery("SELECT * FROM dbo.Fishes WHERE CONTAINS(FishText, @p0)", searchPhrase).ToList();
}



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему