c# - strings - String.Equals() no funciona según lo previsto
string.equals c# (6)
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.
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();
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.
EF4 Linq Oracle11g haciendo consultas, no distingue entre mayúsculas y minúsculas
La comparación de cadenas con StringComparison.OrdinalIgnoreCase
funciona en la memoria o con IEnumerable<T>
. Está intentando usarlo con IQueryable<T>
, pero el proveedor de su consulta no lo comprende.
Esto funciona para mí:
db.Users.FirstOrDefault(
s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase)
);
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)
Utilice String.Compare()
ya que se puede traducir a Sql.
Here hay algunos ejemplos de coincidencia de cadenas en Linq, con la traducción Sql también.