143 votes

Comparaison de chaînes insensible à la casse dans LINQ to SQL

J'ai lu qu'il est déconseillé de l'utiliser ToUpper et ToLower pour effectuer de la casse de la chaîne de comparaisons, mais je ne vois pas d'alternative quand il s'agit de LINQ-to-SQL. Le ignoreCase et CompareOptions arguments de Chaîne.Comparer sont ignorés par LINQ-to-SQL (si vous utilisez une casse de la base de données, vous obtenez une comparaison sensible à la casse, même si vous demandez une comparaison sensible à la casse). Est ToLower ou ToUpper la meilleure option ici? Est-ce mieux que les autres? Je croyais avoir lu quelque part que ToUpper était mieux, mais je ne sais pas si cela s'applique ici. (Je fais beaucoup de revues de code et tout le monde est à l'aide de ToLower.)

Dim s = From row In context.Table Where String.Compare(row.Name, "test", StringComparison.InvariantCultureIgnoreCase) = 0

Cela se traduit par une requête SQL qui compare simplement la ligne.Nom de "test" et ne reviendra pas "Test" et "Test" sur une casse de la base de données.

116voto

Andrew Arnott Points 35346

Comme vous le dites, il existe des différences importantes entre ToUpper et ToLower, et seulement un de fiable précis quand vous essayez de faire de la casse des vérifications d'égalité.

Idéalement, le meilleur moyen de faire un casse contrôle d'égalité est:

String.Equals(row.Name, "test", StringComparison.OrdinalIgnoreCase)

Note de l' OrdinalIgnoreCase à faire de la sécurité la sécurité. Mais exactement le type de cas (en)sensible vérifiez que vous utilisez dépend de ce que vos fins de. Mais, en général, est Égal à utiliser pour les contrôles d'égalité et de Comparer quand vous êtes le tri, puis choisissez le bon StringComparison pour le travail.

Michael Kaplan (une autorité reconnue dans le domaine de la culture et de la manipulation des caractères, comme cela) a billets sur ToUpper vs ToLower:

Il dit "de la Chaîne.ToUpper – Utilisation ToUpper plutôt que ToLower, et spécifier InvariantCulture afin de ramasser des OS règles de casse"

84voto

Andrew Davey Points 2322

J’ai utilisé `` à ma requête.

Il effectue une comparaison insensible à la casse.

0voto

vinahr Points 101

J’ai essayé ceci à l’aide d’expression Lambda, et cela a fonctionné.

``

0voto

Andrew Hare Points 159332

Si vous passez une chaîne de caractères qui est insensible à la casse en LINQ-to-SQL il sera adopté dans le SQL inchangée et la comparaison sera effectuée dans la base de données. Si vous voulez faire de la casse, des comparaisons de chaînes dans la base de données tout ce que vous devez faire est de créer une expression lambda qui ne la comparaison et l'LINQ-to-SQL fournisseur de traduire cette expression dans une requête SQL avec votre chaîne intacte.

Par exemple, cette requête LINQ:

from user in Users
where user.Email == "foo@bar.com"
select user

traduit de l'instruction SQL suivante par le LINQ-to-SQL fournisseur de:

SELECT [t0].[Email]
FROM [User] AS [t0]
WHERE [t0].[Email] = @p0
-- note that "@p0" is defined as nvarchar(11)
-- and is passed my value of "foo@bar.com"

Comme vous pouvez le voir, le paramètre de la chaîne seront comparés dans SQL qui signifie que les choses devraient travailler juste la façon dont vous vous attendez d'eux.

0voto

John Hansen Points 19

Pour effectuer la casse Linq to Sql les requêtes de déclarer la "chaîne" des champs à la casse en spécifiant le type de données du serveur en utilisant l'une des opérations suivantes;

varchar(4000) COLLATE SQL_Latin1_General_CP1_CS_AS 

ou

nvarchar(Max) COLLATE SQL_Latin1_General_CP1_CS_AS

Remarque: Le " CS "dans le au-dessus de classement des types de moyens de ‘casse'.

Cela peut être entrer dans le Serveur de Données de Type" terrain lors de la visualisation d'une propriété à l'aide de Visual Studio DBML Designer.

Pour plus de détails, voir http://yourdotnetdesignteam.blogspot.com/2010/06/case-sensitive-linq-to-sql-queries.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X