zoukankan      html  css  js  c++  java
  • 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>高。


     


  • 相关阅读:
    新华字典有多少字
    lisp install
    OCaml Language Sucks
    Erlang, Haskell, OCaml: screw one, marry one, kill one. Which and why?
    Linux获取网页源码的几种方法
    什么是zhcon
    What is plowshare?
    neo4j简单学习
    neo4j 云端部署
    Clojure语言 vs Scala语言
  • 原文地址:https://www.cnblogs.com/mht91919/p/5818267.html
Copyright © 2011-2022 走看看