es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
)
Tags:  ,

Answer

  1. Avatar for 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 usar EF.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:

    var searchTerms = new[] { "%red%", "%blue%" };
    
    var widgets = await Widgets
        .Where(w => searchTerms.Any(term => EF.Functions.Like(w.Name, term)))
        .Select(w => new { Widget = w, MatchCount = searchTerms.Count(term => EF.Functions.Like(w.Name, term)) })
        .Where(wm => wm.MatchCount == searchTerms.Length)
        .Select(wm => wm.Widget)
        .ToArrayAsync();
    

    Esto consulta la tabla Widgets en busca de filas en las que la columna Name 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étodo Select se utiliza para incluir un recuento de cuántos términos de búsqueda se han cumplido para cada fila, y el último Select se utiliza para eliminar ese recuento y devolver solo los Widgets 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.

Comments are closed.