2009-06-28 5 views
3

Je souhaite vérifier si une balise (sensible à la casse) existe dans la table SQL Server 2005 à l'aide de LINQtoSQL. Disons que si un tag 'BEYONCE' existe dans les tags, alors je veux que je puisse ajouter 'beyonce' ou 'BeYOnce' mais pas 'BEYONCE' à nouveau. Voici la requête LINQ je l'ai écrit:Case Sensitive Where Clause dans LINQtoSQL?

From t In Context.Tags 
Where String.Equals(t.Tag, myTag, StringComparison.Ordinal) = True 

Mais il dit « Egaux booléennes (System.String, System.String, System.StringComparison) » méthode n'a pas de traduction pris en charge à SQL. Quelle est l'autre façon de trouver une étiquette sensible à la casse?

+0

La base de données est-elle sensible à la casse ou à la casse? –

Répondre

3

Si la base de données possède les paramètres de classement par défaut, alors 'blah' et 'BLAH' seront égaux. Je ne pense pas que vous puissiez le faire nativement avec LinqToSQL mais vous pouvez exécuter une requête qui force le classement au niveau de la colonne ... c.-à-d.

String tag = "beYONCE"; Résultat IEnumerable = db.ExecuteQuery (typeof (Int32), "Sélectionnez * From Table1 où Valeur COLLATE Latin1_General_CS_AS = {0}", tag);

Cette requête ne retournerait aucun résultat car la balise de la table contient "beyonce" et non "beYONCE". Changer la balise de chaîne en 'beyonce' retournerait un résultat.

Si vous souhaitez modifier les options de classement de votre base de données, essayez de lire l'article this.

Espérons que cela aide.

+0

Le classement de ce champ est: SQL_Latin1_General_CP1250_CI_AS et le champ est défini nvarchar pour plusieurs langues lorsque je remplace COLLATE Latin1_General_CS_AS avec SQL_Latin1_General_CP1250_CI_AS son information sensible à la casse non identifiante –

0

Je ne pense pas que vous puissiez le faire nativement avec linqtosql. Vous pouvez essayer un peu de ExecuteExpression et quelques case sensitive techniques. Ce n'est pas joli, mais ça devrait faire le travail.


modifier Je ne sais pas si vous utilisez C# ou VB, mais voici un code C#. Je suppose que votre table de base est appelée Tag

IEnumerable<Tag> matches = Context.ExecuteQuery<Tag>(
    "Select * from Tag where Tag = {0} COLLATE Latin1_General_CS_AS", myTag 
); 

Heck, juste pour être complet, voici en vb.net trop :-)

dim matches as IEnumerable(Of Tag) = Context.ExecuteQuery(Of Tag)(_ 
    "Select * from Tag where Tag = {0} COLLATE Latin1_General_CS_AS", myTag _ 
) 

Ceci est la même que Chalkey's réponse .

+0

quelle sera la requête SQL pour cela? J'utilise nvarchar (100) pour ce champ et le classement est: SQL_Latin1_General_CP1250_CI_AS –

Questions connexes