2009-02-18 8 views
7

Für eine Website, die ich gerade mache, verwenden wir LINQ to Entities. Ich wurde damit beauftragt, der Website Suchfunktionen hinzuzufügen. Ich versuche, den elegantesten Weg zu finden, nach mehreren Schlüsselwörtern (Benutzer eingegeben) auf einem einzelnen Feld in der Datenbank zu suchen. Gestatten Sie mir, ein Beispiel zu geben.LINQ to Entities Durchsuchen von Texteigenschaften für mehrere Schlüsselwörter

Tabellenspalten:

Name, Description 

Beispiel Reihe:

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

Benutzersuche (Trennzeichen keine Rolle spielt):

"blue fluffy" 

Derzeit bin ich folgendes:

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)); 
    } 

Dies funktioniert derzeit wie erwartet, aber ich stelle mir vor es ist nicht die beste Lösung für das Problem. Fehle ich etwas, das offensichtlich ist?

HINWEIS: Dies ist AND passend.

+0

Sonderbare, eine Antwort hier war, habe ich es auf, dann runter, weil ich dachte, dass es falsch war, dann ging ich zurück, weil es richtig war, jetzt ist es weg. – jfar

+1

Ja, es gab eine Antwort von casperOne, aber jemand muss es gefunden haben. Er schlug vor, einen gespeicherten Proc zu verwenden, was genau im Moment ist. –

+0

Ich bin in der gleichen Situation ... Haben Sie eine Lösung mit LinqToEntities gefunden, oder haben Sie am Ende eine gespeicherte Prozedur verwendet? – Kjensen

Antwort

3

Sieht aus wie Linq to Entities nicht unterstützt enthält:

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

ich meine eigene Abfrage für diesen einen rollen würde. Sie werden wahrscheinlich die volle Kontrolle über die Textsuchabfragen haben wollen, wenn Sie herausfinden, dass diese Arten von Suchen zu Performance-Problemen werden.

1

wie etwa statt:

IQueryable<SesameCharacters> filter = entities.SesameCharacters; 

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

     output = filter.ToList(); 

Do:

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

weil das die gesamte Beschreibung mit den Schlüsselwörtern übereinstimmt. Nach was ich suche, ist das Zusammenbringen vieler einzelner Wörter zu vielen einzelnen Wörtern. –

10

Das fand ich für mich gearbeitet - dies wird mit VB.Net mit Entity Framework 4.0, aber ich bin sicher, das Prinzip übersetzt.

Dies macht die "OR" -Stil query:

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 

Und dies tut "AND" Stil Anfragen:

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

Hinweis - dies funktioniert mit EF4 aber nicht mit Linq zu Sql in 3.5. – RichardW1001

+0

+1 - Ich habe in den letzten Tagen überall nach einer Lösung für dieses Problem gesucht. Ich habe nicht daran gedacht, es so zu machen. – bernhof