表达式目录树(Expression)
表達(dá)式目錄樹(shù)
什么是表達(dá)式目錄樹(shù)呢?用于表示Lambda表達(dá)式邏輯的一種數(shù)據(jù)結(jié)構(gòu),表達(dá)式樹(shù)也可以稱作表達(dá)式目錄樹(shù),它 將代碼表示成一個(gè)對(duì)象樹(shù),而不是可執(zhí)行的代碼。這個(gè)跟匯編原理一樣,我們找到關(guān)鍵字,把這些語(yǔ)句翻譯成機(jī)器碼,我們這里的關(guān)鍵字就是表達(dá)式樹(shù)里面的節(jié)點(diǎn),然后分析語(yǔ)法詞法,最后變成機(jī)器可識(shí)別的指令。
表達(dá)式目錄樹(shù)有什么作用呢?我們?cè)谑褂胑f框架的時(shí)候經(jīng)常使用linq,使用linq to sql 的時(shí)候有多種方式,直接寫from xx select,也可以使用lambda表達(dá)式,都是把這種語(yǔ)法翻譯成可執(zhí)行的sql,這里我們就會(huì)把lambda表達(dá)式轉(zhuǎn)換成表達(dá)式樹(shù),對(duì)這個(gè)語(yǔ)句進(jìn)行翻譯,然后再在數(shù)據(jù)庫(kù)中執(zhí)行SQL語(yǔ)句,把返回的結(jié)果再返回給一個(gè) IQueryable集合
怎么使用呢?lambda 表達(dá)式被分配給Expressions類型的變量,則編譯器可以執(zhí)行代碼以創(chuàng)建表示該 lambda 表達(dá)式的表達(dá)式樹(shù)。
下面我們來(lái)看例子
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("表達(dá)式:{0}", parmeter1);Console.WriteLine("表達(dá)式體:{0}", body);Console.WriteLine("表達(dá)式左邊節(jié)點(diǎn):{0}", left);Console.WriteLine("表達(dá)式右邊節(jié)點(diǎn):{0}", right);Console.WriteLine("表達(dá)式符號(hào):{0}", symbols);Console.WriteLine("表達(dá)式執(zhí)行結(jié)果:{0}", result);Console.Read(); }執(zhí)行結(jié)果如下:
表達(dá)式:a 表達(dá)式體:(a + b) 表達(dá)式左邊節(jié)點(diǎn):a 表達(dá)式右邊節(jié)點(diǎn):b 表達(dá)式符號(hào):Add 表達(dá)式執(zhí)行結(jié)果:5?
創(chuàng)建表達(dá)式目錄樹(shù)
這里我們用表達(dá)式創(chuàng)建表達(dá)式:(a, b) => (a + b)
?
下面我們?cè)賮?lái)一個(gè),x=>x.ID.ToString().Equals("3")
我們先來(lái)分析下這里的步驟,首先是x找到ID字段,然后執(zhí)行ToString()方法,最后執(zhí)行Equals("3")
我們來(lái)看代碼
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); //調(diào)用ToString() var toString = typeof(int).GetMethod("ToString", new Type[] { }); //x.ID.ToString() var toStringExp = Expression.Call(filedExp, toString, new Expression[0]); //調(diào)用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 }); //表達(dá)式目錄樹(shù)轉(zhuǎn)lambda表達(dá)式 x=>x.ID.ToString().Equals("3") Expression<Func<Student, bool>> expression = Expression.Lambda<Func<Student, bool>>(equalsExp, new ParameterExpression[]{parameterExpression}); //執(zhí)行 true bool result = expression.Compile()(new Student() {ID =3,Name ="張三",Age =20 });?
總結(jié)
以上是生活随笔為你收集整理的表达式目录树(Expression)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android的一些疑问
- 下一篇: Vue学习笔记(3)(Vue CLI)