11
votes

Comment ignorer l'affaire avec Linq-to-SQL?

J'ai des problèmes d'obtenir des données à l'aide de LINQ-TO-SQL. J'utilise la pièce de code suivante pour rechercher un utilisateur de notre application Web (nom d'utilisateur est l'adresse e-mail): xxx

si je tape test@test.com Je reçois un référence Toutefois si je tape test@test.com je ne le fais pas. Comment puis-je obtenir LINQ pour ignorer le boîtier lors de la sélection d'un utilisateur?


3 commentaires

Jetez un coup d'œil à Stackoverflow.com/questions/841226/...


Matin? Il est 16h00 où je suis.


Que diriez-vous de permettre l'insensibilité des cas pour cette colonne sur la base de données? Nous vivons malheureusement toujours dans les moments où une telle 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.


4 Réponses :


15
votes

fait: xxx

travail?

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


6 commentaires

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


@DAVID - Comment vous comparez les choses à Linq depuis que l'expression de Lambda envoyée à SeuletFault est traduite. De cette façon, c'est sûr d'être traduit en SQL.


Fonctionne bien. Cependant, pour d'autres ficelles se compare qui ne sont pas dans Lambdas devrais-je coller avec tolower () ou devrais-je utiliser stringcomparisonison.ordinalignorecase ??


@Mike - Droite, si vous exécutez du côté du client, vous ferez mieux d'utiliser: string.equals (S1, S2, true) ou un system.stringcomerer Propriété qui compare la façon dont vous voulez. En outre, je pense que vous préféreriez utiliser invariantCultureInorecase ou actuelcultureignorecase au lieu de OrdinalInignorecase car ce dernier compare CodePoint-to-CODEPoint au lieu de caractère. -personnage.


Sachez simplement que l'appelant sur la colonne DB s'assurera que même s'il est indexé, SQL Server ne sera pas en mesure d'utiliser cet index. Changer de classement dans une collation insensible à une casse serait un meilleur choix si la table est suffisamment grande pour faire scanner une table une mauvaise chose.


En raison de l'étrangeté de Unicode, Toupper () est préférable à tolower () (il existe plusieurs caractères Unicode qui n'ont pas de variantes minuscules), bien qu'il y ait toujours une ambiguïté (au moins) dans ce majuscule turc i est İ (U + 0130: Capital I avec point de point ci-dessus), pour correspondre à leur minuscule I: ı (U + 0131, petit i), mais ce n'est pas possible de résoudre sans comparaisons spécifiques à la locale ....



5
votes
var referenceUser = db.ReferenceUsers.SingleOrDefault(rf => string.Compare(rf.Email, values["emailAddress"],true)==0);
Where the "true" is whether to ignore case or not

2 commentaires

Tout comme un point de considération, je ne pense pas que cela fonctionnerait sur le serveur, cependant. Je me souviens d'utiliser ce modèle et de ne pas l'interpréter correctement de la requête.


Apparemment, par la façon dont cette réponse est votée, le lectorat est donc assez à l'aise avec les idiomes .NET, mais moins avec Linq sur Iquerisable.



0
votes

Voici comment je l'ai fait. Pourrait vous donner un indice. J'ai une liste avec des profils et je souhaite rechercher des nomons 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();


0 commentaires

-1
votes
listTasks.ItemsSource
    = taskList.Where( x => x.TaskDescription.ToLower()
                            .ToString()
                            .StartsWith(txtSearch.Text.Trim()
                            .ToLower()
                            .ToString()));

0 commentaires