Как я могу получить .ToUpper () (или эквивалент) работать при использовании .Contains () в Linq to Sql? - PullRequest
0 голосов
/ 03 января 2011

Этот код:

keyword = 's';
IEnumerable<Member> searchResults = 
        (from m in members
         where m.ScreenName.ToUpper().Contains(keyword.ToUpper())
         select m).AsEnumerable();

Возвращает только те записи, которые имеют заглавную букву 'S' в ScreenName. Почему m.ScreenName.ToUpper() игнорируется? Как преобразовать m.ScreenName в верхний регистр, чтобы я мог выполнять проверки без учета регистра?

Редактировать

Это не дубликат. Я попытался найти решение в предложенном дубликате:

IEnumerable<Member> searchResults = 
       (from m in members
        where m.ScreenName.Contains(keyword, StringComparison.OrdinalIgnoreCase)
        select m).AsEnumerable();

Это не удалось. StringComparison.OrdinalIgnoreCase не является допустимым параметром для .Contains ().

Ответы [ 2 ]

2 голосов
/ 03 января 2011

Нет способа (AFAIK) явно указать чувствительность / нечувствительность к регистру с помощью Linq-to-SQL.

Я бы порекомендовал изменить схему базы данных, чтобы использовать сопоставление без учета регистра для столбца (столбцов).вы ищете

Параметры сортировки SQL Server управляют такими вещами, как чувствительность к регистру, чувствительность к акценту («кафе» - это то же самое, что и «кафе»?) И правила, используемые для сравнения и сортировки строк.

Параметры сортировкивыбираются из списка, встроенного в SQL Server, и большинство из них будут называться что-то вроде SQL_Latin1_General_CP1_CI_AI

Последние две пары символов являются важным битом - CI_AI означает регистр-нечувствительный, нечувствительный к ударению.Я подозреваю, что для столбца ScreenName вы найдете что-то вроде CS_AI или CS_AS.Измените это, и ваш запрос должен работать правильно.

1 голос
/ 03 января 2011

Сравнение строк AFAIR в SQL само по себе не учитывает регистр.

...