一.什么是ORM
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单来说,ORM 是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中或者将数据库的数据拉取出来
二.EF基本原理
1.EF 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案
2.EF 核心对象DbContext,其基本原理是,实现系统IQueryable<T>接口,通过反射,获取SQL语句,操作数据库
三.模拟EF
1.模拟EF 首先要自定义解析lamdba表达式(解析表达式 是个难点,需要仔细调试)
1)构造表达式解析入口
1 /// <summary> 2 /// 通过Lambda解析为Sql 3 /// </summary> 4 /// <param name="func"></param> 5 /// <returns></returns> 6 public static string GetSqlByExpression(Expression func, DirectionType dirType = DirectionType.None) 7 { 8 var getExp = func; 9 var result = ""; 10 if (getExp is UnaryExpression) 11 { 12 result += VisitUnaryExpression((UnaryExpression)getExp); 13 } 14 if (getExp is BinaryExpression) 15 { 16 result += VisitBinaryExpression((BinaryExpression)getExp); 17 } 18 if (getExp is TypeBinaryExpression) 19 { 20 result += VisitTypeBinaryExpression((TypeBinaryExpression)getExp); 21 } 22 if (getExp is ConditionalExpression) 23 { 24 result += VisitConditionalExpression((ConditionalExpression)getExp); 25 } 26 if (getExp is ConstantExpression) 27 { 28 result += VisitConstantExpression((ConstantExpression)getExp); 29 } 30 if (getExp is ParameterExpression) 31 { 32 result += VisitParameterExpression((ParameterExpression)getExp); 33 } 34 if (getExp is MemberExpression) 35 { 36 result += VisitMemberExpression((MemberExpression)getExp, dirType); 37 } 38 if (getExp is LambdaExpression) 39 { 40 result += VisitLambdaExpression((LambdaExpression)getExp); 41 } 42 if (getExp is NewExpression) 43 { 44 result += VisitNewExpression((NewExpression)getExp); 45 } 46 if (getExp is NewArrayExpression) 47 { 48 result += VisitNewArrayExpression((NewArrayExpression)getExp); 49 } 50 if (getExp is InvocationExpression) 51 { 52 result += VisitInvocationExpression((InvocationExpression)getExp); 53 } 54 if (getExp is MemberInitExpression) 55 { 56 result += VisitMemberInitExpression((MemberInitExpression)getExp); 57 } 58 if (getExp is ListInitExpression) 59 { 60 result += VisitListInitExpression((ListInitExpression)getExp); 61 } 62 if (getExp is MethodCallExpression) 63 { 64 result += VisitMethodCallExpression((MethodCallExpression)getExp); 65 } 66 return result; 67 68 }