2013-05-03 1 views
0

J'ai une fonction de recherche de base où je veux trouver un produit en fonction du titre (nom) du produit.Conseil sur les fonctions de recherche de base

rep.GetDomainObjectsByType("Visuals Product"); 
    var visualsProducts = rep.DomainObjects; 

prodSearched = (from p in visualsProducts 
          from pf in p.DomainObjectFields 
          where pf.FieldName == "Product Title" && pf.FieldValue.Contains(txtSearchValue) 
          select p).Distinct().ToList(); 

Il fonctionne très bien lorsque le titre entier est entré comme « Les avantages et les inconvénients de en stop »

Comment puis-je modifier la requête pour renvoyer le titre sur des correspondances partielles seulement comme « pros et Moins de

de ce qui a trait

Répondre

2

Votre code utilise déjà la méthode String.Contains() qui recherche une sous-chaîne. Le problème avec votre exemple de scénario de test est plus susceptible d'être associé à l'enveloppe de la chaîne de recherche.

Habituellement, cela serait géré à la source de données, par exemple en définissant le classement Insensible à la casse dans la colonne de la base de données.

Sinon, vous pouvez réécrire la requête à utiliser

&& pf.FieldValue.ToUpper().Contains(txtSearchValue.ToUpper()) 

Il est possible d'utiliser

&& pf.FieldValue.IndexOf(txtSearchValue, StringComparison.OrdinalIgnoreCase) > -1 

mais cela est moins susceptible d'être pris en charge par le fournisseur LINQ (par exemple, Entity Framework ne pas le supporter).

1

Dans votre exemple, avez-vous oublié que «avantages et inconvénients» et «Avantages et inconvénients» ont des cas mixtes?

Il existe plusieurs façons d'ignorer le cas. Voici un:

var foo = "The Pros and Cons"; 
bool matched = foo.IndexOf("pros and cons", StringComparison.OrdinalIgnoreCase) >= 0; 

D'autres options incluent 1) minuscules ou majuscules les deux chaînes avant de les comparer, ou 2) utiliser CultureInfo et CompareInfo, ou 3) utiliser la correspondance d'expression régulière insensible à la casse.

Questions connexes