String.Equals () не работает по назначению

Я использую LINQ для поиска по одной из моих таблиц Entity Framework и поиска «группы» на основе имени. Имя является строкой и выглядит как Unicode (говорит, что это находится в edmx). У меня есть метод GetGroup() и я GetGroup() имя для поиска. Отлаживая код, у меня уже есть группа с именем «Тест» в моей базе данных. Как только я перейду в группу под названием «TEST», я ожидаю, что она вернет «Тест», который уже был в базе данных. По какой-то причине он не находит «Тест» и считает, что «ТЕСТ» не существует. Вот мой запрос, я не понимаю, почему он не работает. Пожалуйста помоги.

«name» – это имя переданного в имени группы. Мои .Equals похоже, работают, только если gr.Name и имя gr.Name . Если один символ является капиталом в одной из двух строк, то .Equals не работает. Я попытался использовать InvariantCultureIgnoreCase , и это, похоже, не помогло. В случае, если кто-то спросит, MyLeagueId и LeagueId всегда будут совпадать, firebase database будет настроена так, что может быть группа в другом лиге. Я не думаю, что это проблема.

 Group g = (from gr in this.DatabaseConnection.Groups where gr.Name.Equals(name, StringComparison.OrdinalIgnoreCase) && gr.LeagueId == this.MyLeagueId select gr).FirstOrDefault(); 

При использовании LINQ to Entities он автоматически преобразует его в LINQ to SQL. И если поле базы данных, на котором выполняется .Equals, не имеет набора NOCASE (SQLite в моем примере), тогда он всегда будет чувствителен к регистру. В других словах firebase database определяет, как выполнять сравнение строк, а не код.

Сравнение строк с StringComparison.OrdinalIgnoreCase работает в памяти или с IEnumerable . Вы пытаетесь использовать его с IQueryable , но поставщик вашего запроса не понимает его.

Это работает для меня:

 db.Users.FirstOrDefault( s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase) ); 

Сделал некоторые исследования. Вы не можете этого сделать. Сортировка (тип сравнения) определяется на уровне столбца таблицы. Вы не можете изменить его через EF. Если он определен как нечувствительный к регистру, тогда все поисковые запросы будут нечувствительны к регистру. Если он определен как чувствительный к регистру, то ваша единственная надежда – это ToUpper() строки.

http://connect.microsoft.com/VisualStudio/feedback/details/435783/entity-framework-conceptual-model-doesnt-support-string-equals-via-linq

http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/3810aa67-f6fe-4624-a14b-eaaa0e05ddcd

EF4 Linq Oracle11g делает запросы нечувствительными к регистру

Сравнение с регистром LINQ to Entities

Используйте String.Compare() поскольку он может быть переведен на Sql.

Ниже приведены примеры сопоставления строк в Linq, а также перевод Sql.

Мне нравится ответ TravyGuy с технической точки зрения. Для более прямого, практического ответа попробуйте использовать:

 string.Compare(string A, string B, StringComparison.OrdinalIgnoreCase) == 0 

Попробуйте name.Equals(gr.Name, StringComparison.OrdinalIgnoreCase)

Если он работает, проблема может быть gr.Name с gr.Name .

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

Я предполагаю, что gr.Name не относится к типу System.string . (поскольку String.Equals дает вам ошибку ==> из предыдущего сообщения)

дайте это выстрел

 (gr.Name as string).Equals(name, StringComparison.OrdinalIgnoreCase) 

или

 String.Equals((gr.Name as string), name, StringComparison.OrdinalIgnoreCase) 
  • Как переопределить метод equals в java
  • Какова лучшая страtagsя для Equals и GetHashCode?
  • Как проверить, равна ли моя строка нулевой?
  • Разница между пустой и пустой ("") строкой Java
  • Сравнивая две строки, игнорируя регистр в c #
  • Есть ли утилита отражения Java для глубокого сравнения двух объектов?
  • Разность C # между == и Equals ()
  • Почему мне нужно переопределить методы equals и hashCode в Java?
  • Как реализовать метод hashCode и equals
  • Почему эти ==, но не `equals ()`?
  • В чем разница между IEquatable и просто переопределением Object.Equals ()?
  • Давайте будем гением компьютера.