2013-06-05 1 views
7

У меня есть строка LINQ, что им с помощью в EF, который в основном делает myTable.Where(c => c.Contains('mystring'));сделать Entity Framework использование Содержит вместо Like и объяснить "ПОБЕГ ~

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

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».

+0

Escaping, вероятно, связано избежать подстановочных символов. Попробуйте поместить 'mystring *' вместо 'mystring' - в SQL Server он будет передан как' mystring ~ * 'вероятно - поэтому избегайте говорить, что символ тильды перед подстановочным знаком означает, что это не шаблон, а именно этот символ. – Pako

+0

хм, добавив *, не имело значения. Я думаю, что он подключен к LIKE, поэтому, если я смогу решить точку 1, это может решить пункт 2 – NibblyPig

+0

не имеет никакого значения в каком смысле? Вы просмотрели значение параметра в sql-сервере (используя, например, профилировщик)? Я знаю, что это не решение вашей проблемы или помощь - это просто подсказка о том, почему происходит побег. – Pako

ответ

4

из [Entity Framework блог]: 1

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

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

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

В конце я создал хранимую процедуру для выполнения простого запроса CONTAINS. – NibblyPig