Linq to Sql равенство без учета регистра - PullRequest
5 голосов
/ 06 декабря 2009

Я читаю противоречивые объяснения сравнений строк Linq и Sql.

Когда я делаю следующее:

  from p in db.People 
  where p.UserName=username
  select p

имя пользователя = "JOHN"

Я получаю правильный регистронезависимый результат. Linq делает это по умолчанию или это происходит в базе данных SQL?

Ответы [ 3 ]

4 голосов
/ 06 декабря 2009

Я думаю, что вы получите противоречивые результаты, основанные на том, на что указывает ваша переменная БД и где фактически выполняется сравнение. Если это возможно, linq создаст запрос и отправит его на сервер SQL. Похоже, что вы могли бы принудительно сделать регистр нечувствительным, позвонив

where p.UserName.ToLower()=username.ToLower()
3 голосов
/ 09 декабря 2009

Ваш пример запроса будет выглядеть примерно так:

выберите [t0] .col1, [t0] .col2, ..., [t0] .coln из [схемы]. [люди] где [t0] .UserName = @ p0

... значение в переменной username будет передано в переменную @ p0 sql. Таким образом, чувствительность к регистру, чувствительность к акценту и т. Д. Контролируются параметрами сортировки, которые вы настроили для своего экземпляра SQL Server / db / table / column. Если не указано иное, используется сортировка по умолчанию для DB или экземпляра DB, но сортировка может быть указана вплоть до уровня столбца.

Большинство людей используют SQL Server с сортировками без учета регистра (CI), но, как я уже сказал выше, они могут быть переопределены в БД, поэтому вам просто нужно проверить, какая у вас там сортировка.

Это отличается от того, если вы делаете то же самое, что и запрос L2O (linq to objects), в этом случае чувствительность к регистру является значением по умолчанию, и вам придется сделать его нечувствительным к регистру, используя переопределение string.equals, которое позволяют указать культуру и / или нечувствительность к регистру ...

1 голос
/ 06 декабря 2009

Это зависит от базы данных. SQL Server 2008 обрабатывает строки как нечувствительные к регистру, в том числе при использовании в выражении индекса. Linq этого не делает.

Чтение на MSDN или в этой статье .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...