2009-06-28 3 views
3

Я хочу проверить, существует ли тег (Case-Sensitive) в таблице SQL Server 2005 с использованием LINQtoSQL. Скажем, если в тегах существует тег «BEYONCE», то я хочу, чтобы я мог добавить «beyonce» или «BeYOnce», но не «BEYONCE» снова. Вот запрос LINQ я написал:Case Sensitive Where Clause в LINQtoSQL?

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

Но он говорит 'Булевы Equals (System.String, System.String, System.StringComparison)' метод не поддерживается перевод на SQL. Каким образом можно найти тег, чувствительный к регистру?

+0

Является ли база данных чувствительной к регистру или регистро-независимой? –

ответ

3

Если в базе данных установлены настройки сортировки по умолчанию, то «бла» и «BLAH» будут равны. Я не думаю, что вы можете сделать это изначально с помощью LinqToSQL, но вы можете выполнить запрос, который заставляет сортировку на уровне столбца ... т. Е.

Строковый тег = "beYONCE"; IEnumerable result = db.ExecuteQuery (typeof (Int32), "Выберите * Из таблицы 1 Где значение COLLATE Latin1_General_CS_AS = {0}", тег);

Этот запрос не будет возвращать никаких результатов, потому что тег в таблице имеет «beyonce» в нем, а не «beYONCE». Изменение тега строки на «beyonce» вернет результат.

Если вы хотите изменить параметры сортировки базы данных, попробуйте прочитать статью this.

Надеюсь, это поможет.

+0

Это сопоставление этого поля: SQL_Latin1_General_CP1250_CI_AS и поле определено nvarchar для нескольких языков, когда я заменяю COLLATE Latin1_General_CS_AS на SQL_Latin1_General_CP1250_CI_AS, не идентифицируя информацию, чувствительную к регистру –

0

Я не думаю, что вы можете сделать это изначально с помощью linqtosql.

Вы можете попробовать немного ExecuteExpression и некоторые case sensitive techniques. Это некрасиво, но нужно выполнить эту работу.


редактировать Не уверен, что если вы используете C# или VB, но вот некоторые C# код. Я принимаю вашу базовую таблицу называется Tag

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

Heck, просто для полноты картины, вот это в vb.net тоже :-)

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

Это так же, как Chalkey's ответ ,

+0

какой будет SQL-запрос? Я использую nvarchar (100) для этого поля, а Collation: SQL_Latin1_General_CP1250_CI_AS –