IQueryable/IQueryable 和表达式树
IQueryable有两个组件
Expression:当前查询的组件的与语言和数据源无关的表示形式,以表达式树的形式表示。
Provider:LINQ 提供程序的实例,它知道如何将当前查询具体化为一个值或一组值。
![8cb21ac0d4f14a68c817a8e86c075bc9.png](https://i-blog.csdnimg.cn/blog_migrate/98f85f8bf56e79152fa9a74c73bf02f6.png)
在动态查询的上下文中,提供程序通常会保持不变;查询的表达式树将因查询而异。
达式树是不可变的;如果需要不同的表达式树并因此需要不同的查询,则需要将现有表达式树转换为新的表达式树,从而转换为新的 IQueryable。
![077bdf8b9ebca0c6099ada78940d9a60.png](https://i-blog.csdnimg.cn/blog_migrate/48df95a6f9c8d2d636457c29ca9d4508.png)
从表达式树中使用运行时状态
![7111c7b49f0d19ed96f9c3d03213cf33.png](https://i-blog.csdnimg.cn/blog_migrate/68c1f63f80df6c092beccecf28405614.png)
内部表达式树以及查询尚未修改;查询只返回不同的值,因为 length 的值已更改。
使用工厂方法构造表达式树和查询
构造 Expression
(截取片段)
![a5793b7d6062b8497a82fa17861ea486.png](https://i-blog.csdnimg.cn/blog_migrate/ac764ab09ae4df01a5c40e06abbeccdf.png)
构造要传入到某个 LINQ 方法的表达式时,实际上是在构造 Expression 的实例,其中 TDelegate 是某个委托类型,例如 Func<string, bool>、Action 或自定义委托类型。
![0fe34743f258de2d742c72205b0330c8.png](https://i-blog.csdnimg.cn/blog_migrate/cc865918526e08c87c04594d075ee292.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讲堂