2010-10-09 6 views
3

J'ai un datatable de base, il peut être complètement générique pour cet exemple, à l'exception qu'il contient une colonne Username.Ajout d'une recherche à une requête LINQ

Je voudrais avoir une zone de texte simple et un bouton qui effectue une recherche de similarité sur le terrain Username. Je sais que je peux utiliser la méthode .Contains() et il se traduira par LIKE en SQL, mais est-ce la bonne façon de le faire?

Deuxièmement, supposons que j'ai un autre élément dans une relation plusieurs à plusieurs que je veux également rechercher, dans ce cas Label. Je voudrais finalement trouver tous les éléments de données avec une étiquette semblable à une clause de recherche. Est-ce que je réutilise simplement .Contains?

J'aimerais ensuite trier pour obtenir les meilleurs résultats pour Nom d'utilisateur et de l'étiquette dans la même requête; comment peut-on trier la similarité de {Username et Label}?

Edit: Comment sont les résultats d'une requête comme triés? Il est simplement basé sur l'index, et un binaire correspond-il à ce qu'il ne correspond pas? Je suppose que je ne suis pas si préoccupé par un score de similarité par exemple, je me demandais plus ou moins sur le mécanisme. Il semble que c'est assez facile de retourner des requêtes LIKE, mais j'ai toujours pensé que LIKE était un mauvais choix car il n'utilise pas d'index dans la base de données. Est-ce vrai, si c'est le cas?

Répondre

1

La similarité de chaînes n'est pas quelque chose que SQL peut bien faire. Votre meilleur pari peut être de trouver toutes les correspondances avec les mêmes deux premiers (ou trois si nécessaire) et ensuite, en supposant que c'est un nombre gérable, calculer le score de similarité côté client en utilisant la distance Levenshtein ou similaire (voir http://en.wikipedia.org/wiki/Levenshtein_distance).

Ou si vous vous sentez courageux, vous pouvez essayer quelque chose comme ça! http://anastasiosyal.com/archive/2009/01/11/18.aspx

+0

Ce second lien est intense. C'est super cool de savoir que des trucs comme smith waterman peuvent être faits en sql. J'ai plus ou moins réalisé que le mieux que je puisse faire est un résultat binaire de type "j'aime" ou pas, et pour la plupart, c'est bien. Je me suis surtout enquis de la difficulté d'une recherche de similarité; et il semble, dans ma situation, ne pas en valoir la peine. – Shawn

+0

Côté client, vous pouvez utiliser les bibliothèques C# ici: - http://code.google.com/p/google-diff-match-patch/ –

+0

+1 v. Liens utiles. Merci. –