简体   繁体   English

Expression.Lambda和运行时的查询生成,最简单的“Where”示例

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

I was trying to generate a simple Lambda Expression at runtime with no luck... something like this: 我试图在运行时生成一个简单的Lambda Expression而没有运气......这样的事情:

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

Here is my example class and a fixture queryable: 这是我的示例类和fixture可查询:

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 : 然后我在运行时生成一个lambda表达式, 正确的代码如下

//"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! 非常感谢dtb的建议!

In the following query 在以下查询中

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

the lambda expression is lambda表达式是

item => item.Name == "Soap"

You only need to construct this part, not the Where call which accepts an expression tree. 您只需要构造此部分,而不是接受表达式树的Where调用。

The expression tree for the lambda expression looks like this: lambda表达式的表达式树如下所示:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM