2011-11-04 25 views
10

Otrzymuję ten błąd 'Operator' == 'nie można zastosować do argumentów typu' System.Guid 'i' string '' w linq do entityframework poniżej kodu. w poniższym kodzie CustomerId to Guid, a customerProfileId to ciąg znaków.Operatora '==' Operatora 'System.Guid' i 'string' w linq do encji

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

Odpowiedz

20

Nie można bezpośrednio porównywać elementu Guid z ciągiem znaków. Konwertuj ciąg na Guid lub Guid na ciąg znaków.

Konwersja Guid na ciąg jest tak łatwa jak wywołanie .ToString() dla zmiennej, ale ważne jest, aby wiedzieć, że istnieje więcej niż jeden sposób formatowania Guid. Z lub bez kresek.

someguid.ToString() dadzą ci coś podobnego B06A6881-003B-4183-A8AB-39B51809F196 someGuid.ToString("N") powróci coś B06A6881003B4183A8AB39B51809F196

Jeśli zdecydujesz się przekonwertować C.CustomerId na sznurku upewnij się, że wiesz, co Format customerProfileId w

Jeśli może to być albo format, może być lepiej konwersji customerProfileId na identyfikator: new Guid(customerProfileId).

Wadą tego jest to, że konwersja z ciągu znaków na Guid spowoduje zgłoszenie wyjątku, jeśli nie jest poprawnie sformatowany. Tak więc, jeśli masz customerProfileId z danych wprowadzanych przez użytkownika (np. Pole formularza lub URL), powinieneś najpierw je sprawdzić.

Jeśli jednak przekreślisz konwersję na Guida poza zapytaniem, prawdopodobnie uzyskasz lepszą wydajność, ponieważ porównanie Guidów jest prawdopodobnie szybsze niż porównywanie ciągów.

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

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

To dlatego, że nie można utożsamiać Guida i sznurka.

Musisz najpierw przekonwertować Guid na ciąg. Normalnie sugeruję:

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

ale ToString() nie istnieje w Linq do podmiotów.

Odpowiedź na to pytanie - Problem getting GUID string value in Linq-To-Entity query - prawdopodobnie pomoże.

+2

To nie działa w L2e: 'LINQ do podmiotów nie rozpoznaje metoda 'system.string toString()' metoda, a tej metody nie można przetłumaczyć na wyrażenie sklepu " –

0

go zmienić na:

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

Albo analizować swoje customerProfileId do GUID i użyć jej w zapytaniu.

1

Musisz przekonwertować CustomerId ciąg (wywołanie .ToString()) lub customerProfileId do Guid (wywołanie Guid.Parse()), a następnie porównać je.

0

I jakie jest pytanie?

Oczywiście jedna z wartości to Guid, a druga to ciąg. Możesz spróbować porównać w ten sposób:

C. Customer customer == new Guid (customerProfileId) przyjmujący, że C.CustomerId jest Guid.

0

można zrobić C.CustomerId.toString() == customerProfileId lub wymienić customerProfileId z nowym GUID (customerProfileId)

Drugi powinien być szybciej jak jej tylko jednej konwersji i guid porównuje się szybciej niż ciąg porównuje .

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

trzeba wygenerować nowy guid z łańcucha i powinno działać

Powiązane problemy