Tengo una tabla de usuario con columnas [FirstName] y [LastName]. Estoy tratando de crear una función de búsqueda que devuelva a los usuarios que cumplen uno de los siguientes criterios:
Por ejemplo, si tengo los siguientes usuarios en mi base de datos:
Me gustaría que la función los devuelva todos cuando la entrada sea Jack , pero solo devuelva Jack One cuando la entrada sea Jack One
Actualmente tengo el siguiente código:
var users = context.User.Where(x => x.FirstName == pattern || x.LastName == pattern || x.FirstName + " " + x.LastName == pattern)Pero esto no funciona ya que se traduce a la siguiente consulta en MySQL
...WHERE (`p`.`firstName` = 'Jack One') OR (`p`.`lastName` = 'Jack One')) OR (((`p`.`firstName` + ' ') + `p`.`lastName`) = 'Jack One')No funciona porque creo que necesitamos usar CONCAT(firstName, ' ', lastName) si quiero concatenar varias cadenas en MySQL.
Intenté usar las siguientes funciones de .NET, pero no se pueden traducir a sql (La expresión LINQ... no se pudo traducir. O reescriba la consulta en un formulario que se pueda traducir, o cambie a la evaluación del cliente explícitamente insertando una llamada a ya sea AsEnumerable(), AsAsyncEnumerable(), ToList() o ToListAsync())
¿Cómo puedo lograr esto en .NET CORE 3.1 sin extraer todos los datos en la memoria y evaluarlos en el cliente?
Gracias
Esto parece un caso en el que Linq traduce la consulta de una manera que no está prediciendo.
Yendo desde la memoria y sin IDE disponible para verificarlo, pero pruébalo. Si primero divide el nombre completo en el espacio, puede usar los valores en su consulta.
// returns an array based on the patter, if it can be split var names = pattern.Split(" "); // then use the array elements in the query var users = context.User.Where(x => x.FirstName == pattern || x.LastName == pattern || (x.FirstName == names[0] && x.LastName == names[1]));La última condición OR de la consulta debería evaluar los 2 nuevos elementos en la matriz de nombres, que se creó a partir del patrón.
Parece un error de MySql.Data.EntityFrameworkCore.
En su lugar, uso Pomelo.EntityFrameworkCore.MySql para resolver el problema.