简体   繁体   English

Expression.Lambda和运行时的查询生成,嵌套属性“Where”示例

[英]Expression.Lambda and query generation at runtime, nested property “Where” example

I found very nice answer on a question about building Expression Tree for Where query. 我找到了关于为Where查询构建表达式树的问题的非常好的答案。

Expression.Lambda and query generation at runtime, simplest "Where" example Expression.Lambda和运行时的查询生成,最简单的“Where”示例

Can someone help me and show me how this example could be implemented in the scenario with nested property. 有人可以帮助我,并告诉我如何在具有嵌套属性的场景中实现此示例。 I mean instead of: 我的意思是代替:

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

With that solution: 有了这个解决方案

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

How can I build the tree for the following? 如何为以下构建树?

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

This is the same answer as posted above, but I find this more readable in terms of visualizing an expression tree: 这与上面发布的答案相同,但我发现这在可视化表达式树方面更具可读性:

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

(This answer was originally posted by the OP in the question.) (这个答案最初是由OP在问题中发布的。)

The problem can be solved with: 问题可以通过以下方式解决:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM