expressions c# .net lambda expression-trees dynamic-language-runtime

c# - expressions - Expresión.Lambda y generación de consultas en tiempo de ejecución, el ejemplo más simple de "Dónde"



lambda expressions c# where (1)

Intenté generar una expresión simple de Lambda en tiempo de ejecución sin suerte ... algo como esto:

var result = queryableData.Where(item => item.Name == "Soap")

Aquí está mi clase de ejemplo y un accesorio consultable:

public class Item { public int Id { get; set; } public string Name { get; set; } } IQueryable<Item> queryableData = ...;

A continuación, genero una expresión lambda en tiempo de ejecución código correcto siguiente :

//"item" in "item =>..." var item = Expression .Parameter(typeof(Item), "item"); //property of my item, this is "item.Name" var prop = Expression .Property(item, "Name"); //then "Soap" in ''... => item.Name=="Soap"'' var value = Expression.Constant("Soap"); //equality expression "==" in my primer var equals = Expression.Equal(prop, value); //then lambda var lambda = Expression.Lambda<Func<Item, bool>>(equals, item); //and here are the results var results = queryableData.Where(lambda);

Muchas gracias a dtb por el consejo!


En la siguiente consulta

var result = query.Where(item => item.Name == "Soap")

la expresión lambda es

item => item.Name == "Soap"

Solo necesita construir esta parte, no la llamada Where, que acepta un árbol de expresiones.

El árbol de expresiones para la expresión lambda se ve así:

Lambda / / Equal Parameter / / item Property / "Name" Constant | "Soap" Parameter item

En codigo:

var item = Expression.Parameter(typeof(Item), "item"); var prop = Expression.Property(item, "Name"); var soap = Expression.Constant("Soap"); var equal = Expression.Equal(prop, soap); var lambda = Expression.Lambda<Func<Item, bool>>(equal, item); var result = queryableData.Where(lambda);