String.Equals () non funziona come previsto

Sto usando LINQ per cercare tra le mie tabelle di Entity Framework e trovare un “gruppo” basato sul nome. Il nome è una stringa e sembra essere Unicode (dice che è in edmx). Ho un metodo GetGroup() e passo un nome per cercare. Debug attraverso il codice, ho già un gruppo chiamato “Test” nel mio database. Una volta che passo in un gruppo chiamato “TEST” mi aspetto che restituisca il “Test” che era già nel database. Per qualche ragione, non trova il “Test” e pensa che “TEST” non esiste. Ecco la mia domanda, non riesco a capire perché non funziona. Per favore aiuto.

“nome” è il passato nel nome del gruppo. Il mio .Equals sembra funzionare solo se il gr.Name e il nome sono esattamente gli stessi. Se un personaggio è maiuscolo in una delle due stringhe, allora .Equals non funziona. Ho provato ad usare InvariantCultureIgnoreCase , e questo non sembra essere d’aiuto. Nel caso qualcuno chieda, il MyLeagueId e il LeagueId corrisponderanno sempre, il database è impostato in modo tale che ci possa essere un gruppo in un ID di campionato diverso. Non penso che questo sia il problema.

 Group g = (from gr in this.DatabaseConnection.Groups where gr.Name.Equals(name, StringComparison.OrdinalIgnoreCase) && gr.LeagueId == this.MyLeagueId select gr).FirstOrDefault(); 

Quando si usa LINQ su Entità, lo converte automaticamente in LINQ in SQL. E se il campo del database che stai facendo .Equals su non ha una copia di NOCASE (SQLite nel mio esempio), allora sarà sempre case-sensitive. In altre parole, il database definisce come eseguire il confronto delle stringhe piuttosto che il codice.

Il confronto delle stringhe con StringComparison.OrdinalIgnoreCase funziona in memoria o con IEnumerable . Stai tentando di usarlo con IQueryable , ma il provider del tuo queryable non lo capisce.

Questo funziona per me:

 db.Users.FirstOrDefault( s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase) ); 

Fatto qualche ricerca Non puoi farlo. Le regole di confronto (il tipo di confronto) sono definite a livello di colonna della tabella. Non è ansible modificarlo tramite EF. Se è definito come non sensibile al maiuscolo / minuscolo, tutte le ricerche saranno senza distinzione tra maiuscole e minuscole. Se è definito come maiuscole e minuscole, la tua unica speranza è ToUpper() le stringhe.

http://connect.microsoft.com/VisualStudio/feedback/details/435783/entity-framework-conceptual-model-doesnt-support-string-equals-via-linq

http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/3810aa67-f6fe-4624-a14b-eaaa0e05ddcd

EF4 Linq Oracle11g che effettua query senza distinzione tra maiuscole e minuscole

Confronto tra maiuscole e minuscole LINQ to Entities

Utilizzare String.Compare() poiché può essere String.Compare() in Sql.

Ecco alcuni esempi di corrispondenza delle stringhe in Linq, con la traduzione Sql.

Mi piace la risposta di TravyGuy dal punto di vista tecnico. Per una risposta più diretta e pratica, prova a utilizzare:

 string.Compare(string A, string B, StringComparison.OrdinalIgnoreCase) == 0 

Prova name.Equals(gr.Name, StringComparison.OrdinalIgnoreCase)

Se funziona, il problema potrebbe essere con gr.Name .

— Modificare —

Immagino che gr.Name non sia di tipo System.string . (dal momento che String.Equals ti dà un errore ==> dal post precedente)

dai una possibilità

 (gr.Name as string).Equals(name, StringComparison.OrdinalIgnoreCase) 

o

 String.Equals((gr.Name as string), name, StringComparison.OrdinalIgnoreCase)