Как выполнить сравнение GUID с LINQ без учета регистра? - PullRequest
15 голосов
/ 20 апреля 2011

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

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 userId = (Guid) membershipUser.ProviderUserKey;

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

Ответы [ 4 ]

34 голосов
/ 20 апреля 2011

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

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

22 голосов
/ 20 апреля 2011

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

3 голосов
/ 07 октября 2011

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

2 голосов
/ 20 апреля 2011

Простой способ игнорировать регистр при сравнении строк - просто преобразовать все в нижний (или верхний) регистр, прежде чем сравнивать его. Итак:

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

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

...