防爆pression.Lambda和查询生成在运行时,最简单的"其中"例 [英] Expression.Lambda and query generation at runtime, simplest "Where" example

查看:203
本文介绍了防爆pression.Lambda和查询生成在运行时,最简单的"其中"例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图生成一个简单的lambda前pression在运行时,没有运气...是这样的:

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 = ...;

然后我生成一个lambda EX pression在运行时的正确的code如下

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

非常感谢 DTB 的意见!

推荐答案

在下面的查询

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

拉​​姆达EX pression是

the lambda expression is

item => item.Name == "Soap"

您只需要构造这部分,而不是在哪里调用,它接受一个前pression树。

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

这位前pression树拉姆达EX pression看起来是这样的:

The expression tree for the lambda expression looks like this:

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

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

这篇关于防爆pression.Lambda和查询生成在运行时,最简单的&QUOT;其中&QUOT;例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆