站长统计我要啦免费统计

LINQ的基本认识

前些日子,我的一个兄弟问我一个关于LINQ的问题,他问我AsEnumerable()在他写的一大段代码中的作用。

我不太清楚他是知道想考考我,还是不太清楚,想问题一下,反正我不太知道。

以前接触过一些LINQ,不过都是皮毛,而现在,皮毛都不记得了。借此机会,重新认识一下吧。

 

LINQ是对IEnumerable<T>,因此它的局部变量都必须是IEnumerable<T>对象。

from子句是一个Linq查询的开始,任何一个Linq语句都是以from开始,from子句指定查询的容器,和在此语句有效的局部变量(用来指定容器中的一项,from子句的效果很类似于foreach)。

from子句的语法为 from local in container

local就是在此Linq语句中的局部变量,由于container必须为IEnumerable<T>,他的类型可以由container推导出来(即T)。

var container = new List<string> { "张三", "李四", "王五" };
var query = from name in container
            select name;

foreach (string name in query)
{
    Console.WriteLine(name);
}
而如果container 不是IEnumerable<T>对象的,比如ArrayList,就需要转换一下,
var container = new ArrayList { "张三", "李四", "王五" };
var query = from name in container.Cast<string>()
            select name;
我现在还不是很清楚,AsEnumerable()方法的作用是不是类似于这里的Cast<T>()??这里先留个疑问,等我自己搞清楚再说。

好了,我在另外一篇博文上查询关于IEnumerable()和IQueryable()的区别,毕竟IQueryable()继承于IEnumerable(),有这么一段博有举的例子:
          
          //查询的结果放入IQueryable接口的集合中
IQueryable<T_Class> classesIQue = (from c in schoolEntities.T_Class
orderby c.ID
select c).Skip<T_Class>(3).Take<T_Class>(3);
//注意这个AsEnumerable<T_Class>()在分页查询之前,先将其转换成IEnumerable类型
IEnumerable<T_Class> classesIEnu = (from c in schoolEntities.T_Class
orderby c.ID
select c).AsEnumerable<T_Class>().Skip<T_Class>(3).Take<T_Class>(3);
//因为启用了延迟加载机制,所以下面调用一下,才会真正去读取数据库
int i = 0;
foreach (var c in classesIQue)
{
i++;
}
Console.WriteLine(i);
foreach (var c in classesIEnu)
{
i++;
}
Console.WriteLine(i);

  总结如下: IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。
也就是说:IQueryable<T>的效率要比IEnumerable<T>高。


 


 

posted @ 2016-08-29 15:46  笑笑91919  阅读(217)  评论(0编辑  收藏  举报