2010-11-30 74 views
4

Je suis usint EF et j'ai une simple déclaration LINQ et je veux rechercher des mots. Il y a donc une recherche dans Textbox et un bouton d'envoi.linq recherche de caractères français

lorsque searchtext contient "march" trouve par ex. "des marchés", mais si je cherche "marché" il ne trouve pas. Donc c'est le caractère français.

listAgendaItems = dc.agenda.Where(a => 
         a.libelle_activite.Contains(searchText) 
).ToList<agenda>(); 

La base de données et la table Agenda ont des propriétés étendues -> Collation: French_CI_AS

Alors, comment puis-je fait que je reçois les mots français, aussi? comme "é, à" etc

J'ai également essayé de rechercher "marche" mais il ne trouve pas "marchés".

Répondre

3

Votre classement French_CI_AS est "Insensible à la casse", "Accent-Sensitive". Si vous souhaitez qu'une requête pour "marches" corresponde à "marchés", vous avez besoin de French_CI_AI pour votre classement. Dans la plupart des langues, ce n'est en fait PAS ce que les locuteurs natifs veulent, car les accents sont sémantiquement importants, mais cela peut dépendre des circonstances ou du contexte.

Si, en fait, vos utilisateurs souhaitent toujours des recherches insensibles aux accents, vous devez définir cette propriété de classement sur AI au lieu de AS sur la table (ou les zones spécifiques). Sinon, si le besoin est rare, vous pouvez appliquer le classement à une table dans MS SQL sur une base par requête; Gardez à l'esprit que s'il n'y a pas d'indice sur ce classement, il peut y avoir un coût de performance important. Cela peut être presque négligeable lorsque vous faites une requête% wildcard%, cependant, puisque vous aurez généralement une analyse de table complète dans ce cas de toute façon. La dernière fois que j'ai vérifié, il n'était pas possible de spécifier un classement dans une requête Linq directement, donc si vous faites une insensibilité à la casse sur une base ad-hoc, vous devez utiliser la requête direct-to-sql à travers votre contexte de données. En fonction de votre commentaire, il semble que vous autorisez le stockage du contenu HTML dans votre base de données. Vous avez des références de caractères numériques dans votre table, dont SQL Server ne sait rien, car elles sont une fonctionnalité de HTML, XML et SGML. Vous pouvez seulement faire cette recherche si ces caractères sont des littéraux de chaîne dans un encodage approprié.

NVARCHAR stocke le contenu en Unicode, en particulier UTF-16 et VARCHAR utilisera Windows 1252 avec le classement français.

Si vous acceptez cette entrée via des formulaires Web, assurez-vous que l'encodage de la page est approprié. Si vous ne supportez que les navigateurs modernes (essentiellement IE5 +), UTF-8 est bien supporté, vous devriez donc envisager d'utiliser UTF-8 pour toutes vos demandes et réponses.

Assurez-vous dans votre site Web.config, vous avez quelque chose comme ceci:

<configuration> 
    <system.web> 
     <globalization 
     requestEncoding="utf-8" 
     responseEncoding="utf-8" /> 
    </system.web> 
</configuration> 

Si vous avez déjà des données stockées avec les références de caractères numériques dans votre base de données, vous pouvez les Unescape en traduisant & #ddddd; en séquences littérales UTF-16, et les stocker à nouveau. Assurez-vous de ne pas décoder accidentellement les NCR importantes sur le plan sémantique, telles que les points de code supérieur, inférieur ou interactif.

+0

J'ai changé le classement de French_CI_AS à French_CI_AI pour cette colonne spécifique mais il ne trouve toujours pas. Je serai heureux si ça marche avec les "marchés" mais mieux c'est "marchés" et "marches". Dois-je faire d'autres changements? Je ne peux pas créer un autre SQL simple car ces instructions LINQ sont déjà complexes. Je viens de simplifier dans cet exemple. Donc, je devrais résoudre ce problème avec LINQ. Mais je peux faire des changements dans les tables ou les colonnes ... – ethem

+0

Je viens de voir le texte dans le tabel il contient comme ceci: S é minaire dédiée é é la gestion des mars é s publics Alors c'est la raison pour laquelle il ne trouve pas? Quelqu'un propose une solution? – ethem

+0

Vous avez apparemment HTML dans votre base de données. SQL Server ne sait pas vraiment quoi que ce soit à propos du HTML, donc il ne le trouvera pas. Vous devez stocker ces NCR sous forme de littéraux de chaîne. J'ai fait quelques notes ci-dessus. – JasonTrue

0

ce problème peut être facilement résolu avec collation ou Recherche plein texte. N'essayez-vous pas de déplacer la recherche dans la procédure stockée et de mapper cette procédure avec EF? Ou, pour du texte intégral, vous pouvez créer requête sans l'aide d'expressions Linq

Context.ExecuteStoreQuery<Client> 
("select * from TestDB.Clients as c 
where Freetext(c.description,{0}", searchText) 

PS si vous avez un résultat décrire s'il vous plaît.

+0

Cela semble bien. Mais j'ai simplifié les instructions de linq ci-dessus. Mais pour une nouvelle déclaration, je vais essayer d'utiliser votre échantillon ... ça a l'air bien. – ethem

+0

Salut Aspirin, j'ai essayé d'utiliser votre exemple mais je ne trouve pas la méthode ExecuteStoreQuery dans mon datacontext. Avez-vous un exemple élaboré? Quel est le client ici? l'objet de classe? – ethem

+0

J'utilise EF avec .NET 4, il existe une fonction analogique CreateQuery dans EF à partir de .NET 3.5. dans ce cas Client - est la classe de EF (EntityObject) – ASpirin