Nuestros programadores estrellas han agotado sus reservas de café, en su búsqueda noche y día por la respuesta, hasta que Adriana encontró la contestación en Bitbucket así que hoy la comparte contigo.
Solución:
Solía ser el caso de versiones anteriores de EF core. Ahora string.Contains
distingue entre mayúsculas y minúsculas y, por ejemplo, para sqlite se asigna a la función sqlite `instr()’ (no sé para postgresql).
Si desea comparar cadenas sin distinguir entre mayúsculas y minúsculas, tiene DbFunctions para hacer el trabajo.
context.Counties.Where(x => EF.Functions.Like(x.Name, $"%keyword%")).ToList();
ACTUALIZAR a @Gert:
Una parte de la suposición en la pregunta es incorrecta. string.Contains
NO se convierte en un LIKE expression
a pesar de que SOLÍA ser el caso en las versiones ef core <= 1.0 (creo).
- En servidor SQL
string.contains
se convierte enCHARINDEX()
en oráculo y sqlite eninstr()
que distinguen entre mayúsculas y minúsculas de forma predeterminada, A MENOS QUE db o la intercalación de columnas se defina de otra manera (Nuevamente, no sé para postgresql). - En todos los casos
EF.Functions.Like()
se convierte en un SQLLIKE
expresión que no distingue entre mayúsculas y minúsculas de forma predeterminada, a menos que la base de datos o la intercalación de columnas se defina de otra manera.
Entonces, sí, todo se reduce a la intercalación pero, corríjame si me equivoco, de alguna manera el código puede tener una influencia en la búsqueda que distingue entre mayúsculas y minúsculas dependiendo de cuál de los métodos anteriores utilice.
Ahora, es posible que no esté completamente actualizado, pero no creo que las migraciones principales de EF se ocupen de la intercalación de bases de datos de forma natural y, a menos que ya haya creado la tabla manualmente, terminará con la intercalación predeterminada (se distingue entre mayúsculas y minúsculas para sqlite y yo honestamente no sé para los demás).
Volviendo a la pregunta original, tiene al menos 2 opciones para realizar esta búsqueda que no distingue entre mayúsculas y minúsculas, si no 3 en una versión futura:
- Especifique la intercalación de columnas en la creación usando DbContext.OnModelCreating() usando este truco
- Reemplace su
string.Contains
porEF.Functions.Like()
- O espere una característica prometedora aún en discusión:
EF.Functions.Collate()
función
Mi respuesta se referirá a NpgSQL.
-
EF.Functions.Like()
en PostgreSQL distingue entre mayúsculas y minúsculas, pero puede usarEF.Functions.ILike()
método de extensión ubicado enNpgsql.EntityFrameworkCore.PostgreSQL
asamblea. -
Si no tiene una referencia al ensamblaje de Entity Framework en el lugar donde crea la consulta, puede usar la combinación
ToLower()
yContains()
métodos, porque Npgsql es capaz de traducirToLower()
método para corregir SQL
Ejemplo:
context.Counties.Where(x => x.Name.ToLower().Contains(keyword.ToLower())).ToList();
Sobre el segundo método, tenga en cuenta: es posible que tenga problemas de rendimiento y que encuentre problemas asociados con la codificación.
IQueryable.Where
se ejecuta en la base de datos, por lo que lo más probable es que no distinga entre mayúsculas y minúsculas.
IEnumerable.Where
usa C # String.Contains
por lo que distingue entre mayúsculas y minúsculas.
Lea esta respuesta: Devolver IEnumerable vs. IQueryable
Puntuaciones y comentarios
Más adelante puedes encontrar las explicaciones de otros gestores de proyectos, tú de igual manera eres capaz mostrar el tuyo si te gusta.