C # Expresión dinámica en objeto dinámico

c# expression expression-trees

Pregunta

Asumamos el siguiente escenario:

Tengo dos clases:

public class Customer
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}


public class Employee
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

y luego puedo tener:

List<Customer> customers = new List<Customer>();

List<Employee> employees = new List<Employee>();

Ahora puedo tener así:

public static List<Employee> GetMajorEmployees(this List<Employee> employees)
{
    return employees.Where(t=>t.Age >= 18).ToList();
}

Pero, ¿qué sucede en lugar de ejecutar la consulta en el código? Haga que el usuario la defina en la interfaz de usuario y la ejecute en el lado del servidor de esta manera:

 public static List<T> RunCustomQuery<T>(this List<T> items, dynamic query)
{
    return items.ExecuteQuery(query); // to be implemented
}

Donde query es la expresión real incorporada en la interfaz de usuario por el usuario y guardada en la base de datos.

¿Cómo puedo crear una expresión dinámica en las listas y guardarla en la base de datos como texto o json o xml?

En la interfaz de usuario, el usuario puede seleccionar / construir la consulta. Para la lista de clientes la consulta puede ser algo como:

customers.Where(t=>t.FirstName == "Jhon");

También quiero poder extraer las propiedades automáticamente del objeto dinámico, ya que puedes ver que las dos clases tienen las mismas propiedades pero también algunas diferentes.

¿Alguien me puede indicar la dirección correcta?

Lo que necesito es algo como TFS tiene:

introduzca la descripción de la imagen aquí

Respuesta aceptada

Puedes usar Expression para eso. Te permite armar un árbol de expresiones y compilarlo, y luego puedes usarlo como Func o Action cualquier lugar donde uses lambdas.

O si no lo compila, puede interpretarlo o inspeccionarlo de cualquier otra manera.

Hay algunos proyectos de código abierto que te permiten serializar y deserializar Expresiones, sin embargo, no he usado ninguno, por lo que no puedo hacer recomendaciones.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow