2009-02-18 8 views
7

Per un sito Web che sto utilizzando, stiamo utilizzando LINQ alle entità. Sono stato incaricato di aggiungere funzionalità di ricerca al sito. Sto cercando di capire il modo più elegante per cercare più parole chiave (utente inserito) su un singolo campo nel database. Permettetemi di fare un esempio.LINQ alle entità Ricerca di proprietà del testo per più parole chiave

colonne della tabella:

Name, Description 

Esempio fila:

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

ricerca utente (delimitatore non importa):

"blue fluffy" 

Attualmente sto usando il seguente:

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

Attualmente funziona come previsto ma immagino che non sia la soluzione migliore al problema. Mi manca qualcosa di evidentemente ovvio?

NOTA: Corrispondenza AND.

+0

strano, una risposta era qui, ho votato in su, poi giù perché pensavo che fosse sbagliato, poi è andato a votare di nuovo perché era giusto, ora è andato. – jfar

+1

Sì, c'era una risposta da parte di CasperOne ma qualcuno doveva averlo rimosso. Ha suggerito l'utilizzo di un proc memorizzato, che è ciò che si sta inclinando in questo momento. –

+0

Sono nella stessa situazione ... Hai trovato una soluzione con LinqToEntities o hai finito con l'utilizzo di una stored procedure? – Kjensen

risposta

3

Sembra LINQ to Entities non supporta contiene:

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

mi piacerebbe rotolare il mio query per questo. Probabilmente vorrai avere il pieno controllo sulle query di ricerca del testo se scoprirai che questi tipi di ricerche diventano problemi di prestazioni.

1

come circa invece di:

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

perché corrisponde alla descrizione completa delle parole chiave. Quello che sto cercando è abbinare molte parole individuali a molte singole parole. –

10

ho trovato questo ha funzionato per me - questo sta usando VB.Net con Entity Framework 4.0, ma sono sicuro che il principio si traduce.

Questo fa la "O" interrogazione stile:

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 

E questo si fa "E" le query di stile:

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

Nota: questo funziona con EF4 ma non con Linq su Sql in 3.5. – RichardW1001

+0

+1 - Ho cercato dappertutto una soluzione a questo problema negli ultimi due giorni. Non pensavo di farlo in quel modo. – bernhof

Problemi correlati