2010-02-04 4 views
11

Je rencontre des problèmes lors de l'obtention de données à l'aide de LINQ-to-SQL. J'utilise la pièce de code suivante pour rechercher un utilisateur pour notre application web (nom d'utilisateur est l'adresse e-mail):Comment ignorer un cas avec LINQ-to-SQL?

var referenceUser = 
    db.ReferenceUsers 
     .SingleOrDefault(rf => rf.Email == values["emailAddress"]); 

Si je tape [email protected] je reçois un ReferenceUser si je tape [email protected] je ne sais pas. Comment puis-je faire en sorte que LINQ ignore le cas lors de la sélection d'un utilisateur?

+0

Jetez un oeil à http://stackoverflow.com/questions/841226/case-insensitive-string-compare-in-linq-to-sql –

+1

Matin? Il est 16 heures où je suis. – Oded

+0

Pourquoi ne pas activer l'insensibilité à la casse pour cette colonne de la base de données? Nous vivons malheureusement toujours dans des périodes où un tel réglage est nécessaire. La base de données doit savoir si une colonne est insensible à la casse ou non lors de l'activation de l'indexation. – herzmeister

Répondre

15

Est-ce que:

var referenceUser = 
    db.ReferenceUsers.SingleOrDefault(
     rf => rf.Email.ToUpper() == values["emailAddress"].ToUpper()); 

travail?

Le ToUpper() doit être traduit dans le code SQL correct à exécuter en tant que requête de base de données, puis renvoyer les deux résultats.

+0

C'est ce que je ferais si je ne savais pas qu'il y avait un drapeau de cas d'ignorance, mais +1 pour l'idée. –

+1

@David - comment vous comparez les choses dans LINQ puisque l'expression lambda envoyée à SingleOrDefault est traduite. De cette façon est sûr d'être traduit en SQL. – codekaizen

+0

Fonctionne bien. Cependant, pour d'autres comparaisons de chaînes qui ne sont pas en lambdas, devrais-je m'en tenir à ToLower() ou devrais-je utiliser StringComparison.OrdinalIgnoreCase ?? –

5
var referenceUser = db.ReferenceUsers.SingleOrDefault(rf => string.Compare(rf.Email, values["emailAddress"],true)==0); 

Lorsque le « vrai » est d'ignorer le cas ou non

+0

À titre de considération, je ne pense pas que cela fonctionnerait sur le serveur, cependant. Je me souviens d'avoir utilisé ce modèle et de ne pas avoir interprété la requête correctement. – codekaizen

+5

Apparemment, d'après la façon dont cette réponse a été votée, le lectorat de SO est assez à l'aise avec les idiomes .Net, mais moins avec LINQ sur IQueryable. – codekaizen

0

Voilà comment je l'ai fait. Pourrait vous donner un indice. J'ai une liste avec des profils et je veux rechercher des profils contenant "aR", "Ar" ou "AR".

List<Profile> profileList = CreateProfile(); 
string search = "aR".ToLower(); 

profileList = (from p in profileList where p.Name.ToLower().Contains(search) 
     orderby p.Name select p).ToList(); 
-1
listTasks.ItemsSource 
    = taskList.Where(x => x.TaskDescription.ToLower() 
          .ToString() 
          .StartsWith(txtSearch.Text.Trim() 
          .ToLower() 
          .ToString()));