防爆pression.Lambda和查询生成在运行时,最简单的"其中"例 [英] Expression.Lambda and query generation at runtime, simplest "Where" example
本文介绍了防爆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屋!
查看全文