Linq学习之linq基础知识

Linq刚接触的时候总感觉挺神秘的,后来断断续续的也用过到一些linq的基本查询,只是一直没有系统的学习。

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

一、认识Linq

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

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

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

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

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

IEnumerable <T> 泛型接口

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

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 i 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、执行查询
例:
           //获取数据源
            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 表达式来说是不可能的。

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”。可以将此表达式分配给委托类型
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= {"电视" ,"电冰箱","洗衣机","电话","微波炉"};

方法语法表示:

var SelectDevices =Devices .Where ( device => device.StartsWith(""))
   
            foreach (string dev in SelectDevices)
            {
                Console.WriteLine("带电的设备:{0}",dev);
            }

好了,到这里已经对linq有了一个基本的认识了啊!别着急,慢慢来!今天就到这里吧,要上班了!

原文地址:https://www.cnblogs.com/nyzhai/p/2816220.html