2010-02-04 3 views
11

У меня возникают проблемы с получением данных с использованием LINQ-to-SQL. Я использую следующий фрагмент кода, чтобы посмотреть пользователю нашего веб-приложения (имя пользователя адрес электронной почты):Как игнорировать случай с LINQ-to-SQL?

var referenceUser = 
    db.ReferenceUsers 
     .SingleOrDefault(rf => rf.Email == values["emailAddress"]); 

Если я типа [email protected] я получаю ReferenceUser однако если я типа [email protected] у меня нет. Как я могу заставить LINQ игнорировать случай при выборе пользователя?

+0

Взгляните на http://stackoverflow.com/questions/841226/case-insensitive-string-compare-in-linq-to-sql –

+1

утро? Сейчас я в 16.00. – Oded

+0

Как насчет возможности учета нечувствительности к этому столбцу в базе данных? Мы, к сожалению, все еще живем во времена, когда такая тонкая настройка необходима. База данных должна знать, является ли столбец нечувствительным к регистру или нет, когда это позволяет индексировать его. – herzmeister

ответ

15

ли:

var referenceUser = 
    db.ReferenceUsers.SingleOrDefault(
     rf => rf.Email.ToUpper() == values["emailAddress"].ToUpper()); 

работу?

ToUpper() следует преобразовать в правильный SQL для запуска в качестве запроса к базе данных, а затем вернуть оба результата.

+0

Это то, что я сделал бы, если бы не знал, что есть флаг игнорирования, но +1 для идеи. –

+1

@David - как вы сравниваете вопросы в LINQ, так как выражение lambda, отправленное в SingleOrDefault, переводится. Этот способ обязательно будет переведен в SQL. – codekaizen

+0

Работает хорошо. Однако для других строк сравнения, которые не относятся к lambdas, я должен придерживаться ToLower() или использовать StringComparison.OrdinalIgnoreCase? – 2010-02-04 16:31:45

5
var referenceUser = db.ReferenceUsers.SingleOrDefault(rf => string.Compare(rf.Email, values["emailAddress"],true)==0); 

Если «истина», является ли игнорировать регистр или не

+0

Просто как точка зрения, я не думаю, что это будет работать на сервере. Я вспоминаю использование этого шаблона, а не для корректного интерпретации запроса. – codekaizen

+5

Очевидно, что этот ответ проголосовали, SO-читательская аудитория вполне довольна .Net-идиомами, но в меньшей степени с LINQ на IQueryable. – codekaizen

0

Это, как я это сделал. Можете дать вам подсказку. У меня есть список с профилями, и я хочу искать профили, содержащие «aR», «Ar» или «AR».

List<Profile> profileList = CreateProfile(); 
string search = "aR".ToLower(); 

profileList = (from p in profileList where p.Name.ToLower().Contains(search) 
     orderby p.Name select p).ToList(); 
-1
listTasks.ItemsSource 
    = taskList.Where(x => x.TaskDescription.ToLower() 
          .ToString() 
          .StartsWith(txtSearch.Text.Trim() 
          .ToLower() 
          .ToString())); 
Смежные вопросы