Conversión de Expression<>> a string
Necesito convertir Expression<Func<T, bool>> a string. ¿Cómo puedo hacerlo?
Este es el predicado que estoy intentando convertir:
var prezziList = ExecQuery<Listino>(i => i.CodArt == articolo.CodArt);
Estoy utilizando el método sugerido aquí: https://stackoverflow.com/questions/4793981/converting-expressiont-bool-to-string/4794140, y este es mi método:
public List<TEntity> ExecQuery<TEntity>(Expression<Func<T, bool>> predicate)
{
string expBody = predicate.Body.ToString();
var paramName = predicate.Parameters[0].Name;
var paramTypeName = predicate.Parameters[0].Type.Name;
expBody = expBody.Replace(paramName + ".", paramTypeName + ".")
.Replace("AndAlso", "&&")
.Replace("==", "=");
SQLiteCommand sQLiteCommand = new(App.CNManager.Connection);
sQLiteCommand.CommandText = $"SELECT * FROM myTable WHERE {expBody}";
return sQLiteCommand.ExecuteQuery<TEntity>();
}
Sin embargo, devuelve la siguiente cadena, que obviamente no está en el formato correcto:
"Listino.CodArt = value(Vendo.ViewModels.DettaglioArticoliViewModel+<>c<em>_DisplayClass184</em>0).articolo.CodArt"
¿Dónde estoy cometiendo un error?
davy.ai
El problema con la implementación actual es que el cuerpo de la expresión representa la expresión lambda completa, incluyendo los nombres y tipos de parámetros que no son válidos en la sintaxis SQL. Para convertir la expresión en una cadena SQL válida, necesitamos extraer solo las condiciones y valores involucrados en la expresión.
Para lograr esto, podemos usar un visitante de expresión que inspeccione el árbol de expresiones y construya una cadena SQL basada en los nodos visitados. Aquí hay una implementación de ejemplo:
Luego podemos modificar el método
ExecQuery
para usar este método auxiliar y convertir la expresión en una cadena SQL:Con estos cambios, ahora deberíamos poder convertir la expresión en una cadena SQL válida y usarla para consultar la base de datos.</tentity,></tentity,>