c# - 运行时的 Expression.Lambda 和查询生成,最简单的 "Where"示例

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

我试图在运行时生成一个简单的 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 的建议!

最佳答案

在下面的查询中

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

关于c# - 运行时的 Expression.Lambda 和查询生成,最简单的 "Where"示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8315819/

相关文章:

C# 高级控制台 I/O

.net - 是否可以使用 Roslyn 检测无法访问的代码或其他内置编译警告

c# - XMS.Net 2.1.0.0/1 CWSMQ0282E

c# - 我可以为公共(public) API 中的类覆盖 ToString() 吗?

c# - 计算字符串中字母数字字符的优雅方法?

c# - 在 lambda 中使用匿名类型映射或部分克隆任意数量的对象属性

java - 如何将两个列表中的项目配对

c++ - 使用 lambda 函数定义运算符

c# - 如何在 Xamarin Forms 中的 "re-adding"TabbedPage 子项时禁用 BottomNavigationView 切换模式?

.NET 资源层次结构与文化无关