Expression.Lambda 和运行时的查询生成,最简单的“Where”示例
Posted
技术标签:
【中文标题】Expression.Lambda 和运行时的查询生成,最简单的“Where”示例【英文标题】:Expression.Lambda and query generation at runtime, simplest "Where" example 【发布时间】:2012-01-09 02:11:25 【问题描述】:我试图在运行时生成一个简单的 Lambda 表达式,但没有成功……像这样:
var result = queryableData.Where(item => item.Name == "Soap")
这是我的示例类和可查询的夹具:
public class Item
public int Id get; set;
public string Name get; set;
IQueryable<Item> queryableData = ...;
然后我在运行时生成一个 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);
非常感谢 dtb 的建议!
【问题讨论】:
这里是嵌套属性的扩展示例:***.com/questions/34270207/… 【参考方案1】:在下面的查询中
var result = query.Where(item => item.Name == "Soap")
lambda 表达式是
item => item.Name == "Soap"
您只需要构造这部分,而不是接受表达式树的 Where 调用。
lambda 表达式的表达式树如下所示:
Lambda
/ \
Equal Parameter
/ \ item
Property \
"Name" Constant
| "Soap"
Parameter
item
在代码中:
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);
【讨论】:
抱歉,有些地方不太清楚。这是第二个表达式:var propId = Expression.Property(item, "Id"); var minId = Expression.Constant(15); var greaterThan = Expression.GreaterThan(propId, minId);
要在 lambda 中将 equal 和 greaterThan 与 && 结合起来,我需要 var combined = Expression.AndAlso(equal, greaterThan);
对吗?跨度>
@dtb 我有像id = 1, year = "Year1", month = "Jan", val = 100, othval = 100
这样的对象列表,我需要的是 id = 1 , Year1 = Jan = val = 100, othval = 100
,我不知道year
的值,也不知道@987654330 @ 还。这可以在linq
实现吗?以上是关于Expression.Lambda 和运行时的查询生成,最简单的“Where”示例的主要内容,如果未能解决你的问题,请参考以下文章
基于Expression Lambda表达式树的通用复杂动态查询构建器——《剧透一下》
基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源
#2014 在 phpMyAdmin 上运行查询时的同步命令