zoukankan      html  css  js  c++  java
  • IQueryable与IEnumberable的区别

    转自 http://www.cnblogs.com/fly_dragon/archive/2011/02/21/1959933.html

    IEnumerable接口

    公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代。也就是说:实现了此接口的object,就可以直接使用foreach遍历此object;

    IQueryable 接口

    它继承 IEnumerable 接口,而因为.net版本加入Linq和IQueryable后,使得IEnumerable不再那么单调,变得更加强大和丰富。

    为了区别两个接口,我们通过一个实际的例子来解释一下。

    根据上篇随笔的实例,编写如下代码:

    复制代码
    static void Main(string[] args)
    {
    //创建数据库访问网关
    using (SchoolDBEntities schoolEntities = new SchoolDBEntities())
    {
    //查询的结果放入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);
    }
    Console.WriteLine("OK");
    Console.ReadKey();
    }
    复制代码


    注意红色代码部分,在用linq查询实体集合之前我先将其转换成 IEnumerable接口类型,看看最终执行的sql是怎样的。

    第一种:直接返回 IQueryable类型的查询,如下图所示:

    第二种:在用分页查询之前先将其转换成 IEnumerable实际执行的sql如下图所示:

     

    总结

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

  • 相关阅读:
    ....
    CodeForces 375A(同余)
    POJ 2377 Bad Cowtractors (最小生成树)
    POJ 1258 AgriNet (最小生成树)
    HDU 1016 Prime Ring Problem(全排列)
    HDU 4460 Friend Chains(bfs)
    POJ 2236 Wireless Network(并查集)
    POJ 2100 Graveyard Design(尺取)
    POJ 2110 Mountain Walking(二分/bfs)
    CodeForces 1059B Forgery(模拟)
  • 原文地址:https://www.cnblogs.com/shenbing/p/5394228.html
Copyright © 2011-2022 走看看