【问题标题】:Expression.Lambda and query generation at runtime, nested property “Where” exampleExpression.Lambda 和运行时查询生成,嵌套属性“Where”示例
【发布时间】:2015-12-14 15:03:35
【问题描述】:

我在一个关于为 Where 查询构建表达式树的问题上找到了非常好的答案。

Expression.Lambda and query generation at runtime, simplest "Where" example

谁能帮助我,告诉我如何在嵌套属性的场景中实现这个示例。我的意思是,而不是:

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

使用该解决方案:

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 result = query.Where(item => item.Data.Name == "Soap").

【问题讨论】:

  • 什么是Data?指定此属性
  • 谢尔盖感谢您的帮助。我终于解决了这个问题 - 你可以在下面的更新中查看它。添加第二行,更改第三行。

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


【解决方案1】:

这与上面发布的答案相同,但我发现这在可视化表达式树方面更具可读性:

var parameterItem = Expression.Parameter(typeof(Item), "item");

var lambda = Expression.Lambda<Func<Item, bool>>(
    Expression.Equal(
        Expression.Property(
            Expression.Property(
                parameterItem, 
                "Data"
            ), 
            "Name"
        ), 
        Expression.Constant("Soap")
    ), 
    parameterItem
);

var result = queryableData.Where(lambda);

【讨论】:

    【解决方案2】:

    (此答案最初由问题中的 OP 发布。)

    问题可以通过以下方式解决:

    var item = Expression.Parameter(typeof(Item), "item");
    
    var dataExpr = Expression.Property(item, "Data");
    
    var prop = Expression.Property(dataExpr, "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);
    

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 2016-02-14
      • 1970-01-01
      相关资源
      最近更新 更多