前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET 表达式树

.NET 表达式树

作者头像
郑子铭
发布2023-08-30 10:48:52
1440
发布2023-08-30 10:48:52
举报

IQueryable/IQueryable 和表达式树

IQueryable有两个组件

  • Expression:当前查询的组件的与语言和数据源无关的表示形式,以表达式树的形式表示。
  • Provider:LINQ 提供程序的实例,它知道如何将当前查询具体化为一个值或一组值。

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

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

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

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

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

构造 Expression

(截取片段)

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

LambdaExpression 具有两个组件:

  • 参数列表 (string x) 由 Parameters 属性表示。
  • 主体 x.StartsWith("a") 由 Body 属性表示。

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

  • 使用 Parameter 工厂方法为 lambda 表达式中的每个参数(如果有)定义 ParameterExpression 的对象。
代码语言:javascript
复制
ParameterExpression x = Expression.Parameter(typeof(string), "x");//个人理解就是参数类型以及参数名称

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

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

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

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

代码语言:javascript
复制
Expression<Func<string, bool>> expr = Lambda<Func<string, bool>>(body, x);
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • IQueryable/IQueryable 和表达式树
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档