日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

表达式目录树(Expression)

發布時間:2025/3/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 表达式目录树(Expression) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

表達式目錄樹

什么是表達式目錄樹呢?用于表示Lambda表達式邏輯的一種數據結構,表達式樹也可以稱作表達式目錄樹,它 將代碼表示成一個對象樹,而不是可執行的代碼。這個跟匯編原理一樣,我們找到關鍵字,把這些語句翻譯成機器碼,我們這里的關鍵字就是表達式樹里面的節點,然后分析語法詞法,最后變成機器可識別的指令。

表達式目錄樹有什么作用呢?我們在使用ef框架的時候經常使用linq,使用linq to sql 的時候有多種方式,直接寫from xx select,也可以使用lambda表達式,都是把這種語法翻譯成可執行的sql,這里我們就會把lambda表達式轉換成表達式樹,對這個語句進行翻譯,然后再在數據庫中執行SQL語句,把返回的結果再返回給一個 IQueryable集合

怎么使用呢?lambda 表達式被分配給Expressions類型的變量,則編譯器可以執行代碼以創建表示該 lambda 表達式的表達式樹。

下面我們來看例子

using System.Linq.Expressions; static void Main(string[] args) {Expression<Func<int, int, int>> expression = (a, b) => a + b;var parmeter1 = expression.Parameters[0];var parmeter2 = expression.Parameters[1];BinaryExpression body = (BinaryExpression)expression.Body;ParameterExpression left = (ParameterExpression)body.Left;ParameterExpression right = (ParameterExpression)body.Right;var symbols = body.NodeType;int result = expression.Compile()(2, 3);Console.WriteLine("表達式:{0}", parmeter1);Console.WriteLine("表達式體:{0}", body);Console.WriteLine("表達式左邊節點:{0}", left);Console.WriteLine("表達式右邊節點:{0}", right);Console.WriteLine("表達式符號:{0}", symbols);Console.WriteLine("表達式執行結果:{0}", result);Console.Read(); }

執行結果如下:

表達式:a 表達式體:(a + b) 表達式左邊節點:a 表達式右邊節點:b 表達式符號:Add 表達式執行結果:5

?

創建表達式目錄樹

這里我們用表達式創建表達式:(a, b) => (a + b)
?

int a = 100; int b = 200; ParameterExpression left = Expression.Parameter(typeof(int), "a"); ParameterExpression right = Expression.Parameter(typeof(int), "a"); BinaryExpression binary = Expression.Add(left, right);Expression<Func<int, int, int>> expression = Expression.Lambda<Func<int, int, int>>(binary, left, right); Console.WriteLine($"{expression.ToString()}");//結果:(a, b) => (a + b) Console.WriteLine(expression.Compile().Invoke(a, b));//調用

下面我們再來一個,x=>x.ID.ToString().Equals("3")

我們先來分析下這里的步驟,首先是x找到ID字段,然后執行ToString()方法,最后執行Equals("3")

我們來看代碼

public class Student {public int ID { get; set; }public string Name { get; set; }public int Age { get; set; } } //定義x ParameterExpression parameterExpression = Expression.Parameter(typeof(Student), "x"); //定義匹配常量 var constant = Expression.Constant("3"); var filedId = typeof(Student).GetProperty("ID"); //x.ID var filedExp = Expression.Property(parameterExpression, filedId); //調用ToString() var toString = typeof(int).GetMethod("ToString", new Type[] { }); //x.ID.ToString() var toStringExp = Expression.Call(filedExp, toString, new Expression[0]); //調用Equals() var equals = typeof(string).GetMethod("Equals", new Type[] { typeof(string) }); //x.ID.ToString().Equals("3") var equalsExp = Expression.Call(toStringExp, equals, new Expression[] { constant }); //表達式目錄樹轉lambda表達式 x=>x.ID.ToString().Equals("3") Expression<Func<Student, bool>> expression = Expression.Lambda<Func<Student, bool>>(equalsExp, new ParameterExpression[]{parameterExpression}); //執行 true bool result = expression.Compile()(new Student() {ID =3,Name ="張三",Age =20 });

?

總結

以上是生活随笔為你收集整理的表达式目录树(Expression)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。