2013-06-05 8 views
7

mam linię LINQ że im korzystania w EF, który jest w zasadzie robi myTable.Where(c => c.Contains('mystring'));Bądź użycie Entity Framework Zawiera zamiast podoba i wyjaśnij „ESCAPE ~”

Jest to wygenerowany kod:

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 '~' 

Moje dwa pytania to:

  • Jak mogę użyć ZAWIERA (...) zamiast LIKE? Wygląda na to, że LIKE działa bardzo wolno, gdy tabela używa indeksowania pełnotekstowego. Kopiowanie i wklejanie zapytania zajmuje 4 sekundy, ale jeśli zmienię LIKE na CONTAINS(), to natychmiast.

  • Dlaczego robi ESCAPE "~"? Kopiując + wklejając to do serwera SQL, uruchamia się około 4 razy szybciej, jeśli usunę część "ESCAPE".

+0

ucieczki jest prawdopodobnie ze względu na unikanie znaków wieloznacznych. Spróbuj umieścić 'mystring *' zamiast 'mystring' - w SQL Server zostanie prawdopodobnie przeniesiony jako' mystring ~ * '- stąd ucieczka mówi, że znak tyldy przed symbolem wieloznacznym oznacza, że ​​nie jest to znak wieloznaczny, lecz właśnie ta postać. – Pako

+0

hmm, dodanie * nie miało znaczenia. Myślę, że jest on podłączony do LIKE, więc jeśli uda mi się rozwiązać punkt 1, to może rozwiązać punkt 2: – NibblyPig

+0

nie ma znaczenia, w jakim sensie? Czy sprawdziłeś wartość parametru w serwerze sql (używając na przykład profilera)? Wiem, że to nie rozwiązuje twojego problemu lub nie pomaga - to tylko wskazówka, dlaczego uciekamy. – Pako

Odpowiedz

4

z Entity Framework [blog]: 1

Nie ma natywne wsparcie dla wyszukiwania pełnotekstowego planowanych w danym momencie. Będziesz musiał użyć surowego zapytania SQL.

Wydaje się, że droga jest mniej więcej tak:

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

W końcu stworzyłem procedurę przechowywaną, aby wykonać proste zapytanie CONTAINS. – NibblyPig