Предложение Where с учетом регистра в LINQtoSQL?

Я хочу проверить, существует ли тег (с учетом регистра) в таблице SQL Server 2005 с помощью LINQtoSQL. Допустим, если в тегах существует тег «BEYONCE», я хочу, чтобы я мог снова добавить «beyonce» или «BeYOnce», но не «BEYONCE». Вот написанный мной запрос LINQ:

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

Но он говорит, что метод «Boolean Equals (System.String, System.String, System.StringComparison)» не поддерживает перевод в SQL. Как еще можно найти тег, чувствительный к регистру?


person Marc V    schedule 28.06.2009    source источник
comment
Регистр в базе данных чувствителен или нечувствителен к регистру?   -  person Marc Gravell    schedule 28.06.2009


Ответы (2)


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

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

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

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

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

person Community    schedule 28.06.2009
comment
Сопоставление этого поля: SQL_Latin1_General_CP1250_CI_AS, а поле определяется как nvarchar для нескольких языков, когда я заменяю COLLATE Latin1_General_CS_AS на SQL_Latin1_General_CP1250_CI_AS, это не идентифицирует чувствительную к регистру информацию - person Marc V; 28.06.2009

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

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


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

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

Черт возьми, просто для полноты, вот это тоже на vb.net :-)

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

Это очень похоже на ответ Чалки.

person Dan F    schedule 28.06.2009
comment
какой будет для него SQL-запрос? Я использую nvarchar (100) для этого поля, а параметры сортировки: SQL_Latin1_General_CP1250_CI_AS - person Marc V; 28.06.2009