Expresion.Lambda y generación de consultas en tiempo de ejecución, ejemplo "Where" más simple
Estaba tratando de generar una expresión Lambda simple 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 fixture consultable:
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
IQueryable<Item> queryableData = ...;
Luego genero una expresión lambda en tiempo de ejecución El código correcto sigue :
//"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 su consejo!
40
Author: CodeAddicted, 2011-11-29
1 answers
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 el código:
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);
110
Author: dtb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-29 18:36:30
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-29 18:36:30