2010-06-28 6 views
0

Comment puis-je interroger une collection pour un mot-clé comme "John Doe" où la valeur d'une propriété peut être "John M Doe"? Faire un contenant ne fonctionnera certainement pas, mais voici une idée de ce que je cherche. personnes, pour référence, est une liste contenant des objets Person qui ont des propriétés Name et Description.Requête LINQ pour la recherche en texte intégral

string keyword = "John Doe"; 
var q = from person in people 
     where person.Name.ToLower().Contains(keyword.ToLower()) || person.Description.ToLower().Contains(keyword.ToLower()) 
     select person; 

Répondre

0

Vous pouvez essayer diviser le terme de recherche en jetons et en recherchant pour eux individuellement, mais cela n'aller si loin - il ne sera pas gérer les variations plus complexes. Vous pourrez peut-être créer une expression régulière, mais cela n'attrapera pas nécessairement les cas les plus complexes.

Si vous avez besoin de quelque chose de plus qu'un support de correspondance trivial, vous pouvez regarder dans Lucene.NET, qui a un ensemble plus riche de fonctions de comparaison et de recherche. Lucene inclut un certain support pour Linq, ce qui peut vous permettre de gérer certaines de vos requêtes.

+0

lien est rompu: [nouveau lien Lucene.net] (http://incubator.apache.org/lucene.net/) – Tr1stan

1
bool MatchKeywords(string keyWord, string text) { 
    var tokens = keyWord.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries).Select(s=>s.Trim().ToLower()); 
    return tokens.Any(t => text.ToLower().Contains(t)); 
} 


//... 

string keyword = "John Doe"; 

var q = from person in people 
     where MatchKeywords(keyword, person.Name) 
     select person; 
Questions connexes