2009-02-18 10 views
7

Dla strony internetowej robię używamy LINQ do jednostek. Obciążono mnie dodaniem funkcji wyszukiwania do witryny. Próbuję znaleźć najbardziej elegancki sposób wyszukiwania wielu słów kluczowych (wprowadzonych przez użytkownika) w jednym polu w bazie danych. Pozwól mi podać przykład.LINQ do encji Wyszukiwanie właściwości tekstu dla wielu słów kluczowych

kolumn tabeli:

Name, Description 

przykład rzędu:

"Cookie monster", "Fluffy, likes cookies and blue" 

wyszukiwania użytkownika (separatora nie ma znaczenia):

"blue fluffy" 

Obecnie m użyciu następujących:

public List<SesameCharacters> SearchByKeywords(string keywords) 
    { 
     List<SesameCharacters> output = new List<SesameCharacters>(); 
     string[] k = keywords.ToLower().Split(' '); 
     using (SesameStreet_Entities entities = new SesameStreet_Entities()) 
     { 
      IQueryable<SesameCharacters> filter = entities.SesameCharacters; 

      foreach (string keyword in k) 
       filter = ForceFilter(filter, keyword); 

      output = filter.ToList(); 
     } 
     return output; 
    } 

    private IQueryable<SesameCharacters> ForceFilter(IQueryable<SesameCharacters> filter, string keyword) 
    { 
     return filter.Where(p => p.Description.ToLower().Contains(keyword)); 
    } 

To obecnie działa zgodnie z oczekiwaniami, ale wyobrażam sobie, że to nie jest najlepsze rozwiązanie tego problemu. Czy brakuje mi czegoś jaskrawo oczywistego?

UWAGA: To jest dopasowanie AND.

+0

dziwne, odpowiedź była tutaj, głosowałem go, a następnie w dół, ponieważ myślałem, że to było złe, po czym poszedłem zagłosować, ponieważ było to słuszne, a teraz zniknęło. – jfar

+1

Tak, była odpowiedź od casperOne, ale ktoś musiał ją zdementować. Zasugerował użycie zapisanego proca, który jest tym, na czym się teraz skłaniam. –

+0

Jestem w tej samej sytuacji ... Czy znalazłeś rozwiązanie z LinqToEntities, czy też skończyłeś z użyciem procedury przechowywanej? – Kjensen

Odpowiedz

3

Wygląda Linq do podmiotów nie obsługują zawiera:

http://msdn.microsoft.com/en-us/library/bb738638.aspx

będę toczyć własne zapytanie do tego. Prawdopodobnie będziesz chciał pełnej kontroli nad zapytaniami tekstowymi, jeśli odkryjesz, że tego rodzaju wyszukiwania stają się problemami z wydajnością.

1

jak o zamiast:

IQueryable<SesameCharacters> filter = entities.SesameCharacters; 

     foreach (string keyword in k) 
      filter = ForceFilter(filter, keyword); 

     output = filter.ToList(); 

zrobić:

return (from c in entities.SesameCharacters 
     where k.Contains(c..Description.ToLower()) 
     select c 
     ).ToList(); 
+0

ponieważ pasuje do całego opisu do słów kluczowych. To, czego szukam, to dopasowanie wielu pojedynczych słów do wielu pojedynczych słów. –

10

znalazłem ten pracował dla mnie - to jest za pomocą VB.Net z Entity Framework 4.0, ale jestem pewien, że zasada tłumaczy.

Ten robi "lub" zapytanie styl:

Function Search(ByVal query As String) As IQueryable(Of Product) 
    Dim queryWords As String() = query.Split() 
    Dim entities As New Entities() 

    Return entities.Products.Where(Function(p) queryWords.Any(Function(w) p.Description.Contains(w))) 
End Function 

I to się robi "AND" zapytań styl:

Function Search(ByVal query As String) As IQueryable(Of product) 
    Dim queryWords As String() = query.Split() 
    Dim entities As New Entities() 

    Return entities.Products.Where(Function(p) queryWords.All(Function(w) p.Description.Contains(w))) 
End Function 
+1

Uwaga - okazuje się, że działa to z EF4, ale nie z Linq do Sql w 3.5. – RichardW1001

+0

+1 - Przez ostatnie kilka dni szukałem rozwiązania tego problemu. Nie myślałem o zrobieniu tego w ten sposób. – bernhof

Powiązane problemy