Saltar al contenido

Núcleo de Entity Framework: ¿contiene mayúsculas o minúsculas?

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 en CHARINDEX()en oráculo y sqlite en instr() 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 SQL LIKE 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:

  1. Especifique la intercalación de columnas en la creación usando DbContext.OnModelCreating() usando este truco
  2. Reemplace su string.Contains por EF.Functions.Like()
  3. O espere una característica prometedora aún en discusión: EF.Functions.Collate() función

Mi respuesta se referirá a NpgSQL.

  1. EF.Functions.Like() en PostgreSQL distingue entre mayúsculas y minúsculas, pero puede usar EF.Functions.ILike() método de extensión ubicado en Npgsql.EntityFrameworkCore.PostgreSQL asamblea.

  2. Si no tiene una referencia al ensamblaje de Entity Framework en el lugar donde crea la consulta, puede usar la combinación ToLower() y Contains() métodos, porque Npgsql es capaz de traducir ToLower() 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.Containspor 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *