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

11

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

Expression.Lambda和运行时生成查询,最简单的“Where”示例

请问是否有人能够帮助我,并展示如何在嵌套属性的情况下实现此示例。我的意思是,代替:

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”?请指定此属性。 - Sergii Zhevzhyk
Sergii,感谢你的帮助。我终于解决了这个问题 - 你可以在下面的更新中查看。第二行已经添加,第三行已经更改。 - Piotr Czarnecki
2个回答

2

这个问题可以通过以下方法解决:

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

2

这与上面发布的答案相同,但我认为在可视化表达树方面更易读:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接