Сравнение строк без учета регистра с linq-to-sql и linq-to-objects - PullRequest
8 голосов
/ 05 марта 2010

см. Также Различия между LINQ to Objects и LINQ to SQL

Мы используем некоторые запросы к нашей базе данных и нашим в объектах памяти .

Каков наилучший способ выполнения нечувствительной строки по сравнению с linq-to-sql?

  • На SQL Server работает быстро
  • Одно и то же выражение запроса можно использовать с linq-to-objects для получения того же результата

Использование

a.ToLowerInvariant() == b.ToLowerInvariant()

по крайней мере дает те же результаты, но, насколько я могу судить, он не обрабатывается на сервере SQL, поэтому может быть намного медленнее, чем

a == b

Ответы [ 3 ]

7 голосов
/ 05 марта 2010

Чувствительность к регистру в вашей базе данных SQL определяется настройкой параметров сортировки. По умолчанию, я думаю, что большинство баз данных нечувствительны к регистру, поэтому вам следует проверить, действительно ли вам нужно явно обрабатывать чувствительность к регистру.

При настройке сопоставления SQL_Latin1_General_CP1_CI_AS - CI обозначает нечувствительный к регистру, а AS обозначает чувствительный к акценту.

К сожалению, Linq-to-Sql игнорирует дополнительные параметры String.Compare(), поэтому вы не сможете явно установить чувствительность к регистру для сравнения. Однако он будет работать с linq для объектов.

Если вы используете сортировку с учетом регистра, вы можете использовать что-то вроде SqlMethods.Like(field, "string"), чтобы использовать запрос LIKE, который не учитывает регистр, но это не переводит в linq для объектов.

1 голос
/ 05 марта 2010

Вот список поддерживаемых строковых операций в LINQ to SQL, которые, очевидно, будут работать в LINQ для объектов: http://msdn.microsoft.com/en-us/library/bb882672.aspx

Лично я не оценивал каждую из них на производительность, но ToLower и ToUpper aren 't поддерживается в LINQ to SQL, поэтому кажется, что Compare является хорошим кандидатом.Вы можете исследовать переведенный SQL с помощью инструмента, такого как LINQPad, который имеет бесплатную версию и переводит запрос в базу данных SQL, и посмотреть, как он работает с БД.

Кроме того, LINQ to Objects, вероятно, отличается, так чтохорошо для одного не хорошо для другого ...

0 голосов
/ 05 марта 2010

Я не эксперт по linq to sql, но вы можете просто использовать метод строки ToUpperInvariant () перед сравнением.

...