Оператор '==' не может применяться к операндам типа "System.Guid" и "string" в linq для объекта

Я получаю эту ошибку 'Operator' == 'не может быть применен к операндам типа' System.Guid 'и' string '' в linq для сущности в коде ниже. в приведенном ниже коде CustomerId является Guid и customerProfileId является строкой.

var accountQuery = from C in CustomerModel.CustomerProfile
                  where C.CustomerId == customerProfileId // Error here                    
                 select C;

Ответ 1

Вы не можете напрямую сравнивать Guid с строкой. Преобразуйте строку в Guid или Guid в строку.

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

someguid.ToString() даст вам что-то вроде B06A6881-003B-4183-A8AB-39B51809F196 someGuid.ToString("N") вернет что-то вроде B06A6881003B4183A8AB39B51809F196

Если вы решите преобразовать C.CustomerId в строку, убедитесь, что знаете, в каком формате находится C.CustomerId customerProfileId.

Если это может быть любой формат, вам может быть лучше конвертировать customerProfileId в guid: new Guid(customerProfileId).

Недостатком этого является то, что преобразование из строки в Guid приведет к исключению, если оно не отформатировано правильно. Итак, если вы получили customerProfileId от ввода пользователя (например, поля формы или URL-адреса), вы должны сначала его проверить.

Однако, если вы выберете преобразование в Guid вне вашего запроса, вы, вероятно, получите лучшую производительность, поскольку сравнение гидов, вероятно, быстрее, чем сравнение строк.

var customerProfileGuid = new Guid(customerProfileId);  
// wrap in try catch if needed

var accountQuery = from C in CustomerModel.CustomerProfile
                   where C.CustomerId == customerProfileGuid                    
                   select C;

Ответ 2

Это потому, что вы не можете приравнивать Guid и строку.

Поэтому вам нужно сначала преобразовать Guid в строку. Обычно я предлагаю:

where C.CustomerId.ToString().Equals(customerProfileId)

но ToString() не существует в Linq для Entities.

Ответ на этот вопрос - проблема с получением строкового значения GUID в запросе Linq-To-Entity - вероятно, поможет.

Ответ 3

Вы должны преобразовать CustomerId в строку (вызов .ToString()) или customerProfileId в Guid (вызов Guid.Parse()), а затем сравнить их.

Ответ 4

Измените его на:

var accountQuery = from C in CustomerModel.CustomerProfile
                  where C.CustomerId.ToString() == customerProfileId                
                 select C;

Или проанализируйте ваш customerProfileId в Guid и используйте это в запросе.

Ответ 5

И в чем вопрос?

Очевидно, что одно из значений - Guid, а другое - строка. Вы можете как-то сравнить:

C.CustomerId == new Guid (customerProfileId), использующий C.CustomerId.

Ответ 6

Можете ли вы выполнить C.CustomerId.toString() == clientProfileId или заменить clientProfileId новым Guid (customerProfileId)

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

Ответ 7

var accountQuery = from C in CustomerModel.CustomerProfile
              where C.CustomerId == new Guid(customerProfileId) // Error here                    
             select C;

вам нужно создать новый указатель из строки, и он должен работать