• 往事如风   2014/7/27 11:15:00
  • Linq学习初体验
  • 关键字: linq Lambda表达式
  •  Linq刚接触的时候总感觉挺神秘的,后来断断续续的也用过到一些linq的基本查询,只是一直没有系统的学习。

    接下来的博客只当从头对linq来一个全面的学习(本系统博客注重的主要是实用型,可能更多的是Lambda查询表达的一些用法),下面开始第一篇

    一、认识Linq

    LINQ:语言集成查询(Language Integrated Query),是一系列标准查询操作符的集合,这些操作符几乎对每一种数据源的导航,过滤和执行都是提供了底层的基本查询架构。这是LINQ的官方解释。简单点说就是对一个数据集进行重新筛选。

    LINQ操作对象:关系数据、XML、DataSet、或内存中的数据。

    LINQ出现的背景:大多数开发人员对OO(面向对象编程)的熟悉,最好提把对数据的操作转化成对对象的操作。而LINQ恰好将标准查询功能直接整合到了供开发人员选择的基于.NET的编程语言中。

    LINQ技术的重点是查询表达式,因为它描述了对数据源的具体操作

    认识LINQ不得不先说两个接口

    IEnumerable <T> 泛型接口

    公开枚举数,该枚举数支持在指定类型的集合上进行简单迭代。


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class MyCollections<T> : IEnumerable<T>
        {
            T[] values = new T[100];
            public IEnumerator<T> GetEnumerator()
            {
                for (int i = 0; i < 100; i++)
                {
                    yield return values[i];
                }
            }
            IEnumerator IEnumerable.GetEnumerator()
            {
                return GetEnumerator();
            }
        }
        class Class2
        {
            static void Main()
            {
                MyCollections<int> Mycol = new MyCollections<int>();
                foreach (int in Mycol)
                {
                    Console.WriteLine(i);
                }
            }
        }

    Iqueryable<T>提供对数据类型已知的特定数据源的查询进行计算的功能。 

    此接口继承 IEnumerable<T>接口,因此,如果它表示一个查询,则可以枚举该查询的结果。枚举强制执行与 Iqueryable<T>对象关联的表达式目录树。

    二、LINQ查询表达式基本概念

    1.查询表达式可用于查询和转换来自任意支持 LINQ 的数据源中的数据。例如,单个查询可以从 SQL 数据库检索数据,并生成 XML 流作为输出。
    2.查询表达式容易掌握,因为它们使用许多常见的 C# 语言构造。
    3.查询表达式中的变量都是强类型的,但许多情况下您不需要显式提供类型,因为编译器可以推断类型。
    4.在您循环访问 foreach 语句中的查询变量之前,不会执行查询。
    5.在编译时,根据 C# 规范中设置的规则将查询表达式转换为“标准查询运算符”方法调用。任何可以使用查询语法表示的查询也可以使用方法语法表示。但是,在大多数情况下,查询语法更易读和简洁。
    6.作为编写 LINQ 查询的一项规则,建议尽量使用查询语法(不过本人更喜欢用方法语法),只在必需的情况下才使用方法语法。这两种不同形式在语义或性能上没有区别。查询表达式通常比用方法语法编写的等效表达式更易读。
    7.一些查询操作,如 Count 或 Max,没有等效的查询表达式子句,因此必须表示为方法调用。方法语法可以通过多种方式与查询语法组合。
    8.查询表达式可以编译为表达式目录树或委托,具体取决于查询所应用到的类型。Ienumerable<T> 查询编译为委托。IQueryable 和 Iqueryable<T> 查询编译为表达式目录树。

    三、查询表达式操作
    查询表达我把它分为三步
    1、获取数据源
    2、创建查询
    3、执行查询
    例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //获取数据源
    string[] Devices= {"电视" ,"电冰箱","洗衣机","电话","微波炉"};
    //创建查询
    var SelectDevices = from device in Devices
                                    where device.StartsWith("电")
                                    select device;
    //执行查询
    foreach (string dev in SelectDevices)
          {
              Console.WriteLine("带电的设备:{0}",dev);
           }

    四、匿名方法

    在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。不过,本主题中有关匿名方法的信息同样也适用于 Lambda 表达式。

    有一种情况下,匿名方法提供了 Lambda 表达式中所没有的功能。匿名方法使您能够省略参数列表(就是delegate后面什么都没有),这意味着可以将匿名方法转换为带有各种签名的委托。这对于 Lambda 表达式来说是不可能的。

    1
    2
    3
    4
    5
    6
    delegate void Del(int i);
    Del d = delegate { MessageBox.Show(“aaaaaa”); };  //正确
    d(1);
     
    Del d1  =n=> { MessageBox.Show(“sssss”); };//固定对应
    d1(2);

    五、Lambda表达式

    到这里真正到了本次博客的重点了,因为本人更喜欢用方法语法的缘故吧!呵呵

    下面先认识一下Lambda表达式吧

    1、“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。
    2、 所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。Lambda 表达式 x => x * x 读作“x goes to x times x”。可以将此表达式分配给委托类型

    1
    2
    3
    4
    5
    6
    7
    static void Main()
        {
              del myDelegate = x => x * x;
              int j = myDelegate(5); //j = 25
              Console.WriteLine(j);
        }
         delegate int del(int i);

    3、只有在 Lambda 有一个输入参数时,括号才是可选的;否则括号是必需的。无参也需要括号,两个或更多输入参数由括在括号中的逗号分隔:

         (x, y) => x == y

    4、在编写 Lambda 时,通常不必为输入参数指定类型,因为编译器可以基于 Lambda 主体、基础委托类型以及 C# 3.0 语言规范中描述的其他因素推断类型。对于大多数标准查询运算符,第一个输入是源序列中的元素的类型。因此,如果要查询 IEnumerable<Customer>,则输入变量将被推断为 Customer类型,这意味着您可以访问其方法和属性:

    customers.Where(c => c.City == "London");

    说这么多了,总感觉不舒服,还是直接来个例子实在啊!

    string[] Devices= {"电视" ,"电冰箱","洗衣机","电话","微波炉"};
    方法语法表示:

    1
    2
    3
    4
    5
    var SelectDevices =Devices .Where ( device => device.StartsWith("电"))
                foreach (string dev in SelectDevices)
                {
                    Console.WriteLine("带电的设备:{0}",dev);
                }
    好了,到这里已经对linq有了一个基本的认识了啊!别着急,慢慢来!今天就到这里吧,要上班了!