Expression.Lambda and query generation at runtime, simplest “Where” example

穿精又带淫゛_ 提交于 2019-11-26 07:57:40

问题


I was trying to generate a simple Lambda Expression at runtime with no luck... something like this:

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

Here is my example class and a fixture queryable:

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
}

IQueryable<Item> queryableData = ...;

Then I generate a lambda expression at runtime correct code follows:

//\"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);

Big thanks to dtb for advice!


回答1:


In the following query

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

the lambda expression is

item => item.Name == "Soap"

You only need to construct this part, not the Where call which accepts an expression tree.

The expression tree for the lambda expression looks like this:

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

In code:

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);


来源:https://stackoverflow.com/questions/8315819/expression-lambda-and-query-generation-at-runtime-simplest-where-example

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!