sql >> Base de Datos >  >> RDS >> PostgreSQL

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

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 una expresión LIKE expression aunque SOLÍA ser el caso en las versiones ef core <=1.0 (creo).

  • En SQLServer string.contains se convierte en CHARINDEX() , en oracle y sqlite en instr() que distinguen 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 (Nuevamente, no sé para postgresql).
  • En todos los casos EF.Functions.Like() se convierte en un SQL LIKE expression 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 o que no distingue entre mayúsculas y minúsculas, según 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 sinceramente, no sé por 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