Как мне выполнить сравнение идентификаторов GUID без учета регистра с LINQ?

#c# #.net #linq #.net-4.0 #asp.net-membership

#c# #.net #linq #.net-4.0 #asp.net-членство

Вопрос:

В приведенном ниже коде я хочу сравнить два идентификатора GUID. Проблема в том, что я не получаю никаких возвращаемых задач, потому что идентификаторы GUID имеют разный регистр (верхний и нижний регистр). Мне нужно выполнить сравнение без учета регистра.

 MembershipUser membershipUser = Membership.GetUser();
string strUserId = membershipUser.ProviderUserKey.ToString();

Guid userId = new Guid(strUserId.ToUpper());

lblUserId.Text = userId.ToString();

DataModelEntities dc = new DataModelEntities();

var userTasks = dc.tasks.Where(t => t.user_id == userId).ToList();
  

Как мне сравнить идентификаторы GUID и найти совпадения независимо от регистра?

ОБНОВЛЕНИЕ 1 теперь идентификатор guid из поставщика членства преобразуется в идентификатор GUID

 Guid userId = (Guid) membershipUser.ProviderUserKey;
  

Но я все еще не получаю никаких совпадений.

Комментарии:

1. Почему вы сравниваете идентификаторы GUID как строки, а не просто как System.Guid ?

2. @Matt — Как мне выполнить преобразование в идентификатор GUID? Я искал преобразование. ToGuid (или что-то подобное), но ничего не смог найти.

3.вы можете использовать Guid.Parse(...) , Guid.TryParse(...) или Guid.TryParseExact(...) msdn.microsoft.com/en-us/library/system.guid.aspx

Ответ №1:

== перегружен в Guid, поэтому вам не нужно сравнивать строковые представления.

Смотрите http://msdn.microsoft.com/en-us/library/system.guid.op_equality (v = VS.90).aspx

Комментарии:

1. В документации явно не указано, что сравнение учитывает регистр. Делает ли это? Как мы можем быть уверены?

2. Операторы Guid поддерживают как == , так и !=

Ответ №2:

Не уверен, почему вы сравниваете их как текст, но вместо t.user_id == userId использования t.userId.Equals(userId, StringComparison.OrdinalIgnoreCase)

Комментарии:

1. Внимание, equals требует, чтобы идентификатор пользователя был ненулевым. Используйте StringComparer. OrdinalIgnoreCase.Equals(str1, str2)

2. Или String.Equals(x, y, StringComparison.OrdinalIgnoreCase)

Ответ №3:

У меня всегда была проблема с использованием == для сравнения столбцов guid / uniqueidentifier в операторах linq (особенно в предложении where), поэтому я выбрал довольно безопасный путь использования — (entityGuidColumn.compareTo(guidParameter) ==0) . У меня это сработало. Попробуйте.

Ответ №4:

Простой способ игнорировать регистр при выполнении сравнения строк — это просто преобразовать все в нижний (или верхний) регистр перед сравнением. Итак:

 var userTasks = dc.tasks.Where(t => t.user_id.ToString().ToLower() == userId.ToString().ToLower()).ToList();
  

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

Комментарии:

1. Используйте StringComparison вместо ToLower() / ToUpper() из каменного века

2. Это откачивает больше памяти (что может быть значительным узким местом в зависимости от объема «задач») и может давать неправильные результаты в зависимости от локали.

3. Я знал, что это увеличивает объем памяти — я в основном работаю над проблемами, когда память и вычислительные циклы дешевы, что делает меня чрезмерно ленивым. Однако я не осознавал, что это может дать неверные результаты. Спасибо за подсказку, мне нужно будет узнать больше (как всегда)…