【问题标题】:Expression.Lambda and query generation at runtime, simplest "Where" exampleExpression.Lambda 和运行时的查询生成,最简单的“Where”示例
【发布时间】: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 的建议!

【问题讨论】:

标签: c# .net lambda expression-trees dynamic-language-runtime


【解决方案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 中将 equalgreaterThan&& 结合起来,我需要 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实现吗?
猜你喜欢
  • 1970-01-01
  • 2016-02-14
  • 2014-03-08
  • 2016-07-21
  • 2020-01-18
  • 2021-04-26
  • 2018-01-03
  • 2017-03-11
  • 1970-01-01
相关资源
最近更新 更多