文档介绍:抛弃EF,20分构建一个属于自己的ORM框架(下)
static void Main(string[] args) { string[] Names = { 'Andy', 'Amy', 'Mike' }; Expressionbool>> func = x => (!() & ( == 'A' || () > 5)); ResolveExpress resolve = new ResolveExpress(); (func); (); foreach (var item in ) { ( + ':' + ); } (); }
结果:这里有几个重要的东西要给大家讲下
string[] Names={“Andy”,”Amy”,”Mike”};
1.)x => ();
2.)x => ()==false;
3.)x => !();
这3种在Expression中的表现都不一样
1的话会看成是一个静态方法(MethodCallExpression)
2的话会看成是一个2元运算(BinaryExpression)
3的话会看成是一个1元运算(UnaryExpression)
所以我们都要支持,处理都有所不同。
还有
x=>
string name=”123″;
x=>==name;
和
x=>==”123″
的处理也不一样。大家可以在例子中细细的看看。
这样的构造使得我们切换数据库变得非常简单。因为我们程序中的查询都是基于lambda。换了数据库只要添加一个对应的lamdba转数据库查询条件的实现就可以了。写得够多了。至于数据层怎么封装,到了这一步它已经变得没什么难度了。希望大家能从文章中有所启发和帮助
下篇文章将结合解析Expression和IQueryable来实现延迟加载
补充点东西
IEnumerable和IQueryable有什么不同?
为什么EF查询后返回的是IQueryable而不是IEnumerable。我们对着IQueryableF12去看看。啥都没,就继承了几个接口。鼠标移到IQueryable上。F12IQueryable中有3个属性。
Type是类型。
Expresstion是表达式。
那IQueryProvider是什么?
再看看IQueryProvider接口的定义。
CreateQuery是创建查询条件
Ex