Combinando .Any y EF.Functions.Like
Combinar EF.Functions.Like
y .Any
parece generar una expresión no traducible. ¿Hay alguna forma de realizar la siguiente consulta?
var searchTerms = new[] { "%red%", "%blue%", /* número desconocido de términos aquí */ };
var widgets = await Widgets
.Where(w => searchTerms.Any(term => EF.Functions.Like(w.Name, term)))
.ToArrayAsync();
Esperaba que lo anterior se tradujera en el mismo SQL equivalente:
SELECT *
FROM Widgets
WHERE EXISTS (
SELECT 1
FROM @tbl_terms
WHERE [Name] LIKE term
)
davy.ai
Es correcto que combinar
EF.Functions.Like
y.Any
puede resultar en una expresión no traducible. Una posible solución alternativa es usarEF.Functions.Like
dentro de una subconsulta y luego usar.Where
para comparar el resultado de la subconsulta con los términos de búsqueda. Aquí hay un ejemplo:Esto consulta la tabla
Widgets
en busca de filas en las que la columnaName
coincida con cualquiera de los términos de búsqueda, luego filtra los resultados para incluir solo las filas donde se cumplan todos los términos de búsqueda. El métodoSelect
se utiliza para incluir un recuento de cuántos términos de búsqueda se han cumplido para cada fila, y el últimoSelect
se utiliza para eliminar ese recuento y devolver solo losWidgets
que coinciden.Esto debería traducirse a SQL de manera similar a su ejemplo, aunque probablemente dependerá de la versión específica de EF Core y el proveedor de la base de datos utilizado.