2009-01-07 4 views
2

J'ai une table qui contient une liste de noms de restaurants et des liens vers une autre table qui contient le type de cuisine.Tests de recherche complets dans LINQ (requête de filtre personnalisée)

Je souhaite fournir un champ de recherche sur ma page Web qui, lors de la saisie, recherche chaque mot dans la base de données et renvoie les résultats. Je cherchais une solution qui n'implique pas la mise en place de la recherche en texte intégral sql car je veux pouvoir la tester en utilisant Linq to SQL.

De mon ancien code j'ai une fonction qui crée un filtre de requête donné le texte d'entrée et renvoie tous les résultats basés sur cela.

Private Function SetupQuery(ByVal searchText As String) As String 
    Dim searchFields As New List(Of String) 

    searchFields.Add("Name") 
    searchFields.Add("Postcode") 
    searchFields.Add("Cuisine") 

    Dim firstCol As Boolean = True 

    Dim a() As String 
    Dim j As Integer 
    a = searchText.Trim.Split(" ") 

    Dim filter As String = "" 

    Dim compareString As String 
    For Each col As String In searchFields 
     For j = 0 To a.GetUpperBound(0) 
      compareString = a(j).ToUpper() 
      compareString = compareString.Trim() 

      If firstCol Then 
       filter = filter & col & " LIKE '" & compareString & "%' " 
       firstCol = False 
      Else 
       filter = filter & " or " & col & " LIKE '" & compareString & "%' " 
      End If 
     Next 
    Next 

    Return filter 
End Function 

Cela a les champs de recherche codés en dur et des boucles puis à travers chacun et chaque mot dans le texte de recherche pour construire un filtre OU COMME. Je suis sûr que je pourrais alors utiliser ceci dans mon code LINQ mais cela ne semble pas une solution élégante d'autant plus que les colonnes sont codées en dur et non utilisées par LINQ.

Quelqu'un pourrait-il recommander une meilleure façon de le faire ou quelques conseils dans quelle direction aller avec cela?

Merci

Répondre

1

Vous pouvez utiliser la recherche en texte intégral et toujours utiliser LINQ to SQL Vous pouvez créer une procédure stockée et appeler LINQ. En plus de trouver les correspondances exactes, vous pouvez retourner:

  • recherches simples pour des mots ou des expressions spécifiques
  • recherches Thesaurus formes synonymes de mot - une recherche sur IE peut renvoyer hits sur Internet Explorer et IE (extension à base de thésaurus chercher); une recherche sur Bombay pourrait également renvoyer des hits à Mumbai (recherche de remplacement basée sur thesaurus)
  • Les recherches qui retourneront toutes les différentes formes linguistiques d'un mot (appelé générations) recherche sur banque retournera hits à bancaire, banque, banques, banques et banque de, etc. (toutes les déclinaisons et/ou conjugaisons de la banque à long terme de recherche)
  • Accent recherches insensibles - une recherche sur un café renverrait visites à café et un café

http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx

http://www.simple-talk.com/sql/learn-sql-server/sql-server-full-text-search-language-features/

0

Ce n'est probablement pas la meilleure façon de le faire, mais si vous obtenez toujours le texte de recherche sous forme de chaîne divisée en un tableau de trois vous pouvez alors essayer d'utiliser ceci:

from t in temp 
where t.Name == a(0) 
|| t.Postcode == a(1) 
|| t.Cuisine == a(2) 
select t 

que je fais normalement C#, si naturellement quelque chose dans VB fait peur, mais je pense que la syntaxe LINQ devrait être similaire

Questions connexes