.NET深入解析LINQ框架(三:LINQ优雅的前奏)
2012-12-04 13:05
323 查看
阅读目录:
1.动态LINQ查询(动态构建Expression<T>表达式树)
2.DLR动态语言运行时(基于CLR之上的动态语言运行时)
什么是动态LINQ查询?LINQ的编写是静态的,因为C#是基于静态类型系统原理设计的,在编写时已经确定类型,也就是在编译时就已经知道将要执行什么样的查询,条件是什么、排序方式是什么等等。那么很大一部分应用场合中我们需要根据用户的选择来查询数据源,以往我们都是通过判断的方式来拼接查询的SQL字符串,但是现在我们面对是强类型的LINQ查询,是否可以很方便的进行类似查询。其实也没有什么好神秘的,基本的实现原理是通过动态的构建表达式树来实现IQueryable<T>接口的查询。
其实动态LINQ查询所能执行的最关键的因素在于Expression<T>对象是可以被动态编译成可以执行的委托对象,委托对象是完全可以被直接使用的可执行代码段,这就为动态LINQ查询提供了基础。对于IEnumerable<T>类型的查询表达式方法都知道它的执行是不会直接接受Expression<T>类型对象的,那么动态LINQ是否能工作于IEnumerable<T>接口?其实可以的,有个很隐蔽的窍门隐藏在IQueryable<T>扩展方法对象Queryable中,也就是AsQueryable<T>方法,它返回的是一个实现了IQueryable<T>接口的EnumerableQuery对象,该对象的实现内容不是很复杂,将动态拼接的数据结构Expression<T>对象编译成可以执行的匿名函数,然后直接执行查询。
我们来看一下EnumerableQuery对象的重点,它肯定有一个地方是将Expression<T>对象Compiler的地方。
View Code
一个很简单的例子告诉我们可以在C#中去编写如JS中的动态对象功能,不过目前还不是很成熟,动态对象的成员没有智能提示,应该是还没有被大面积使用起来,以后肯定也是一大美餐;
总结:LINQ框架的基本使用原理就全部结束了,后面我们就来学习如何能让LINQ查询我们自定义的数据源。很多朋友都喜欢自己写ORM框架,那么你肯定少不了对LINQ的支持吧?后面我们就来详细的讲解如何扩展IQueryable<T>、IQueryableProvider<T>两个重量级接口,只有他们两个才能让我们和LINQ对话,这两个接口还是很神秘的。
作者:王清培
出处:http://www.cnblogs.com/wangiqngpei557/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
1.动态LINQ查询(动态构建Expression<T>表达式树)
2.DLR动态语言运行时(基于CLR之上的动态语言运行时)
1】.动态LINQ查询(动态构建Expression<T>表达式树)
什么是动态LINQ查询?LINQ的编写是静态的,因为C#是基于静态类型系统原理设计的,在编写时已经确定类型,也就是在编译时就已经知道将要执行什么样的查询,条件是什么、排序方式是什么等等。那么很大一部分应用场合中我们需要根据用户的选择来查询数据源,以往我们都是通过判断的方式来拼接查询的SQL字符串,但是现在我们面对是强类型的LINQ查询,是否可以很方便的进行类似查询。其实也没有什么好神秘的,基本的实现原理是通过动态的构建表达式树来实现IQueryable<T>接口的查询。
其实动态LINQ查询所能执行的最关键的因素在于Expression<T>对象是可以被动态编译成可以执行的委托对象,委托对象是完全可以被直接使用的可执行代码段,这就为动态LINQ查询提供了基础。对于IEnumerable<T>类型的查询表达式方法都知道它的执行是不会直接接受Expression<T>类型对象的,那么动态LINQ是否能工作于IEnumerable<T>接口?其实可以的,有个很隐蔽的窍门隐藏在IQueryable<T>扩展方法对象Queryable中,也就是AsQueryable<T>方法,它返回的是一个实现了IQueryable<T>接口的EnumerableQuery对象,该对象的实现内容不是很复杂,将动态拼接的数据结构Expression<T>对象编译成可以执行的匿名函数,然后直接执行查询。
我们来看一下EnumerableQuery对象的重点,它肯定有一个地方是将Expression<T>对象Compiler的地方。
View Code
static void Main(string[] args) { dynamic objModel = new ExpandoObject();//初始化可以动态添加属性、方法、事件的ExpandoObject对象 objModel.Name = "王清培";//设置属性值 objModel.Age = 24; objModel.WriteEvent = null;//存放事件的委托字段定义 objModel.WriteEvent += new Action<string>(WriteName);//设置事件的方法 objModel.WriteEvent(objModel.Name + objModel.Age); Console.ReadLine(); } public static void WriteName(string info) { Console.WriteLine(info); }
一个很简单的例子告诉我们可以在C#中去编写如JS中的动态对象功能,不过目前还不是很成熟,动态对象的成员没有智能提示,应该是还没有被大面积使用起来,以后肯定也是一大美餐;
总结:LINQ框架的基本使用原理就全部结束了,后面我们就来学习如何能让LINQ查询我们自定义的数据源。很多朋友都喜欢自己写ORM框架,那么你肯定少不了对LINQ的支持吧?后面我们就来详细的讲解如何扩展IQueryable<T>、IQueryableProvider<T>两个重量级接口,只有他们两个才能让我们和LINQ对话,这两个接口还是很神秘的。
作者:王清培
出处:http://www.cnblogs.com/wangiqngpei557/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- .NET深入解析LINQ框架(二:LINQ优雅的前奏)
- .NET深入解析LINQ框架(三:LINQ优雅的前奏)
- .NET深入解析LINQ框架(二:LINQ优雅的前奏)
- .NET深入解析LINQ框架(一:LINQ优雅的前奏)
- .NET深入解析LINQ框架(二:LINQ优雅的前奏)
- .NET深入解析LINQ框架(一:LINQ优雅的前奏)
- .NET深入解析LINQ框架(一:LINQ优雅的前奏)
- .NET深入解析LINQ框架(一:LINQ优雅的前奏)[转载]
- .NET深入解析LINQ框架(一:LINQ优雅的前奏)
- .NET深入解析LINQ框架(三:LINQ优雅的前奏)
- .NET深入解析LINQ框架(三:LINQ优雅的前奏)
- .NET深入解析LINQ框架
- .NET深入解析LINQ框架1
- .NET深入解析LINQ框架2
- .NET深入解析LINQ框架(四:IQueryable、IQueryProvider接口详解)
- .NET深入解析LINQ框架(四:IQueryable、IQueryProvider接口详解)
- .NET深入解析LINQ框架(六:LINQ执行表达式)
- .NET深入解析LINQ框架(六:LINQ执行表达式)
- .NET深入解析LINQ框架(六:LINQ执行表达式)
- .NET深入解析LINQ框架