表达式目录树(Expression)
生活随笔
收集整理的這篇文章主要介紹了
表达式目录树(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)
?
下面我們再來一個,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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android的一些疑问
- 下一篇: Testlink使用心得