.NET 表达式树

IQueryable/IQueryable 和表达式树

IQueryable有两个组件

  • Expression:当前查询的组件的与语言和数据源无关的表示形式,以表达式树的形式表示。

  • Provider:LINQ 提供程序的实例,它知道如何将当前查询具体化为一个值或一组值。

8cb21ac0d4f14a68c817a8e86c075bc9.png

在动态查询的上下文中,提供程序通常会保持不变;查询的表达式树将因查询而异。

达式树是不可变的;如果需要不同的表达式树并因此需要不同的查询,则需要将现有表达式树转换为新的表达式树,从而转换为新的 IQueryable。

077bdf8b9ebca0c6099ada78940d9a60.png

从表达式树中使用运行时状态

7111c7b49f0d19ed96f9c3d03213cf33.png

内部表达式树以及查询尚未修改;查询只返回不同的值,因为 length 的值已更改。

使用工厂方法构造表达式树和查询

构造 Expression

(截取片段)

a5793b7d6062b8497a82fa17861ea486.png

构造要传入到某个 LINQ 方法的表达式时,实际上是在构造 Expression 的实例,其中 TDelegate 是某个委托类型,例如 Func<string, bool>、Action 或自定义委托类型。

0fe34743f258de2d742c72205b0330c8.png

LambdaExpression 具有两个组件:

  • 参数列表 (string x) 由 Parameters 属性表示。

  • 主体 x.StartsWith("a") 由 Body 属性表示。

构造 Expression 的基本步骤如下所示:

  • 使用 Parameter 工厂方法为 lambda 表达式中的每个参数(如果有)定义 ParameterExpression 的对象。

ParameterExpression x = Expression.Parameter(typeof(string), "x");//个人理解就是参数类型以及参数名称

使用你定义的 ParameterExpression 和 Expression 的工厂方法来构造 LambdaExpression 的主体。

例如,表示 x.StartsWith("a") 的表达式的构造方式如下:

Expression body = Call(
x,
typeof(string).GetMethod("StartsWith", new[] { typeof(string) })!,
Constant("a")
);//拆分表达式给body赋值

使用适当的 Lambda 工厂方法重载,将参数和主体包装到编译时类型的 Expression 中:

Expression<Func<string, bool>> expr = Lambda<Func<string, bool>>(body, x);

转自:EasonLiu

链接:cnblogs.com/EsonLiu/p/17534985.html

- EOF -

技术群:添加小编微信dotnet999

公众号:dotnet讲堂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
表达式目录是一个强大的功能,可以将代码表示为形结构,以便在运行时进行解析。使用表达式目录可以编写更灵活,可扩展和类型安全的代码。在 .NET 中,可以使用表达式目录委托来创建表达式目录。下面是一个完整的示例,演示如何使用表达式目录委托: ```csharp using System; using System.Linq.Expressions; class Program { static void Main() { // 定义参数 ParameterExpression x = Expression.Parameter(typeof(int), "x"); ParameterExpression y = Expression.Parameter(typeof(int), "y"); // 创建表达式目录 BinaryExpression sum = Expression.Add(x, y); // 创建委托 Func<int, int, int> sumFunc = Expression.Lambda<Func<int, int, int>>(sum, x, y).Compile(); // 使用委托计算结果 int result = sumFunc(1, 2); Console.WriteLine(result); } } ``` 在这个例子中,我们首先定义了两个参数 `x` 和 `y`,它们分别表示要相加的两个整数。然后,我们创建了一个 `BinaryExpression` 对象,它表示将 `x` 和 `y` 相加的操作。接着,我们使用 `Expression.Lambda` 方法将表达式目录转换为一个委托,并编译它以生成可执行代码。最后,我们使用生成的委托计算 `1 + 2` 的结果并输出它。 请注意,表达式目录的主要优点之一是它们是类型安全的。在上面的示例中,我们明确指定了参数和返回值的类型,因此编译器可以在编译时执行类型检查,从而避免在运行时出现类型错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值