Comportamiento de Entity Framework con espacios en blanco.
Tengo un escenario en el que necesito permitir duplicados vacíos y rechazar otros tipos de duplicados, por lo que estoy revisando los registros existentes antes de insertar uno nuevo utilizando la siguiente consulta.
this.dbContext.Employees.FirstOrDefault(t =>!string.IsNullOrEmpty(t.Name) && !string.IsNullOrEmpty(newRecord.Name) && t.Name.Trim().Equals(newRecord.Name.Trim(), StringComparison.InvariantCultureIgnoreCase));
El problema es que cuando tengo datos como los siguientes:
oldRecord.Name=” ”
newRecord.Name=” ”
La consulta anterior devuelve Null, lo cual es extraño porque
el resultado de !string.IsNullOrEmpty(” “) es true
el resultado de ” “.Trim().Equals(” “.Trim(), StringComparison.InvariantCultureIgnoreCase) es true
Así que la consulta anterior debería darme resultados.
¿Alguna idea de por qué estoy obteniendo este comportamiento? ¿Y la consulta anterior será evaluada en el lado del cliente?
davy.ai
Parece que el problema está relacionado con el método
FirstOrDefault
. Este método devolverá el primer elemento de la secuencia que satisface la condición especificada por la expresión lambda. Como los dos strings están vacíos, la condición no se cumple y el método devuelvenull
.Para resolver este problema, puedes utilizar el método
Any
en lugar deFirstOrDefault
. Este método devolverátrue
si algún elemento de la secuencia satisface la condición especificada por la expresión lambda.this.dbContext.Employees.Any(t =>!string.IsNullOrEmpty(t.Name) && !string.IsNullOrEmpty(newRecord.Name) && t.Name.Trim().Equals(newRecord.Name.Trim(), StringComparison.InvariantCultureIgnoreCase));
La consulta se evaluará en el lado del servidor.