String.Equals () no funciona según lo previsto

Estoy usando LINQ para buscar a través de una de mis tablas de Entity Framework y encontrar un “grupo” basado en el nombre. El nombre es una cadena y parece ser Unicode (dice que está en el edmx). Tengo un método GetGroup() y paso un nombre para buscar. Depurando a través del código, ya tengo un grupo llamado “Prueba” en mi base de datos. Una vez que paso en un grupo llamado “TEST”, espero que devuelva la “Prueba” que ya estaba en la base de datos. Por alguna razón, no encuentra la “Prueba” y piensa que “PRUEBA” no existe. Aquí está mi consulta, no puedo ver por qué no funciona. Por favor ayuda.

“nombre” es el aprobado en el nombre del grupo. Mi .Equals parece funcionar solo si gr.Name y name son exactamente iguales. Si un carácter es capital en una de las dos cadenas, entonces .Equals no funciona. Intenté usar InvariantCultureIgnoreCase , y eso no pareció ayudar. En caso de que alguien pregunte, MyLeagueId y LeagueId siempre coincidirán, la base de datos se configura para que pueda haber un grupo en una ID de liga diferente. No creo que este sea el problema.

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

Al usar LINQ to Entities, automáticamente lo convertirá en LINQ to SQL. Y si el campo de la base de datos en el que está haciendo un .Equals no tiene un cotejo de NOCASE (SQLite en mi ejemplo), siempre será sensible a mayúsculas y minúsculas. En otras palabras, la base de datos define cómo hacer la comparación de cadenas en lugar de código.

La comparación de cadenas con StringComparison.OrdinalIgnoreCase funciona en la memoria o con IEnumerable . Está intentando usarlo con IQueryable , pero el proveedor de su consulta no lo comprende.

Esto funciona para mí:

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

Hizo algo de investigación. No puedes hacer La intercalación (el tipo de comparación) se define en el nivel de columna de la tabla. No puedes modificarlo a través de EF. Si se define como insensible a mayúsculas y minúsculas, todas las búsquedas serán insensibles a las mayúsculas y minúsculas. Si se define como sensible a mayúsculas y minúsculas, entonces su única esperanza es ToUpper() las cadenas.

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 haciendo consultas, no distingue entre mayúsculas y minúsculas

Comparación de mayúsculas y minúsculas de LINQ to Entities

Utilice String.Compare() ya que se puede traducir a Sql.

Aquí hay algunos ejemplos de coincidencia de cadenas en Linq, con la traducción Sql también.

Me gusta la respuesta de TravyGuy desde una perspectiva técnica. Para una respuesta más directa y práctica, intente usar:

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

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

Si funciona, entonces el problema podría ser con gr.Name .

— Editar —

Supongo que gr.Name no es del tipo System.string . (dado que String.Equals le da un error ==> de la publicación anterior)

dale una oportunidad

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

o

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