转载自:https://www.cnblogs.com/dotnet261010/p/8278793.html

一、为什么要使用LINQ

要理解为什么使用LINQ,先来看下面一个例子。假设有一个整数类型的数组,找到里面的偶数并进行降序排序。

在C#2.0以前,如果要实现这样的功能,我们必须使用'foreach'或'for'循环来遍历数组,先找到偶数然后在降序排序,相关代码如下:

 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 7 namespace LinqOfSelectOperation8 {9     class Program
10     {
11         static void Main(string[] args)
12         {
13             // 查询出数组中的偶数并排序
14             int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 };
15             // 定义一个整数类型的集合,用来存放数组中的偶数
16             List<int> list = new List<int>();
17             // 遍历数组查询出偶数放到集合中
18             foreach (int i in ints)
19             {
20                 // 如果是偶数,把偶数加入到集合中
21                 if (i % 2 == 0)
22                 {
23                     list.Add(i);
24                 }
25             }
26
27             // 正序排序
28             list.Sort();
29             // 反转
30             list.Reverse();
31             // 输出
32             Console.WriteLine(string.Join(",",list));
33
34             Console.ReadKey();
35         }
36     }
37 }

使用for循环很麻烦,而且不可维护和可读。C#2.0引入了delegate,可以使用委托来处理这种场景,代码如下图所示:

 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 7 namespace LinqOfSelectOperation8 {9     // 定义委托
10     delegate bool FindEven(int item);
11
12     class IntExtension
13     {
14         public static int[] where(int[] array, FindEven dele)
15         {
16             int[] result=new int[5];
17             int i = 0;
18             foreach (int item in array)
19             {
20                 if (dele(item))
21                 {
22                    result[i]=item;
23                     i++;
24                 }
25             }
26
27             return result;
28         }
29     }
30     class Program
31     {
32         static void Main(string[] args)
33         {
34             // 查询出数组中的偶数并排序
35             int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 };
36
37             //delegate(int item){return item % 2 == 0;}表示委托的实现
38             List<int> list = IntExtension.where(ints, delegate(int item)
39             {
40                 return item % 2 == 0;
41             }).ToList();
42             // 正序排序
43             list.Sort();
44             // 反转
45             list.Reverse();
46             // 输出
47             Console.WriteLine(string.Join(",", list));
48
49             Console.ReadKey();
50         }
51     }
52 }

所以,有了C#2.0,通过使用委托有了代理的优势,不必使用for循环来查询不同条件的数组。例如你可以使用相同的委托来查找数组中的奇数,并降序排序输出,代码如下图所示:

 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 7 namespace LinqOfSelectOperation8 {9     // 定义委托
10     delegate bool FindEven(int item);
11
12     class IntExtension
13     {
14         public static int[] where(int[] array, FindEven dele)
15         {
16             int[] result=new int[3];
17             int i = 0;
18             foreach (int item in array)
19             {
20                 if (dele(item))
21                 {
22                    result[i]=item;
23                     i++;
24                 }
25             }
26
27             return result;
28         }
29     }
30     class Program
31     {
32         static void Main(string[] args)
33         {
34             // 查询出数组中的奇数并排序
35             int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 };
36
37             //delegate(int item){return item % 2 != 0;}表示委托的实现
38             List<int> list = IntExtension.where(ints, delegate(int item)
39             {
40                 return item % 2 != 0;
41             }).ToList();
42             // 正序排序
43             list.Sort();
44             // 反转
45             list.Reverse();
46             // 输出
47             Console.WriteLine(string.Join(",", list));
48
49             Console.ReadKey();
50         }
51     }
52 }

虽然使用delegate可以使程序的可读性增加了,但是C#团队认为他们仍然需要使代码更加紧凑和可读,所以他们在C#3.0中引入了扩展方法、Lambda表达式、匿名类型等新特性,你可以使用C#3.0的这些新特性,这些新特性的使用LINQ的前提,可以用来查询不同类型的集合,并返回需要的结果。

下面的示例演示了如何使用LINQ和Lambda表达式根据特定条件来查询数组,示例代码如下:

 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 7 namespace LinqOfSelectOperation8 {  9     class Program
10     {
11         static void Main(string[] args)
12         {
13             // 查询出数组中的奇数并排序
14             int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 };
15
16             // 使用LINQ和Lambda表达式查询数组中的偶数
17             int[] intEvens= ints.Where(p => p % 2 == 0).ToArray();
18             // 使用LINQ和Lambda表达式查询数组中的奇数
19             int[] intOdds = ints.Where(p => p % 2 != 0).ToArray();
20
21             // 输出
22             Console.WriteLine("偶数:" + string.Join(",", intEvens));
23             Console.WriteLine("奇数:" + string.Join(",", intOdds));
24
25             Console.ReadKey();
26         }
27     }
28 }

在上面的例子中可以看到,我们在单个语句中使用LINQ和Lambda表达式指定不同的查询条件,因此,LINQ使代码更加紧凑和可读,并且它也可以用于查询不同的数据源。看到这里的时候,你可能会问:究竟什么是LINQ呢?下面将会具体讲解什么是LINQ。

二、什么是LINQ

长期以来,开发社区形成以下的格局:

1、面向对象与数据访问两个领域长期分裂,各自为政。

2、编程语言中的数据类型与数据库中的数据类型形成两套不同的体系,例如:

  C#中字符串用string数据类型表示。

  SQL中字符串用NVarchar/Varchar/Char数据类型表示。

3、SQL编码体验落后

  没有智能感知效果。

  没有严格意义上的强类型和类型检查。

4、SQL和XML都有各自的查询语言,而对象没有自己的查询语言。

上面描述的问题,都可以使用LINQ解决,那么究竟什么是LINQ呢?

LINQ(Language Integrated Query)即语言集成查询。

LINQ是一组语言特性和API,使得你可以使用统一的方式编写各种查询。用于保存和检索来自不同数据源的数据,从而消除了编程语言和数据库之间的不匹配,以及为不同类型的数据源提供单个查询接口。

LINQ总是使用对象,因此你可以使用相同的查询语法来查询和转换XML、对象集合、SQL数据库、ADO.NET数据集以及任何其他可用的LINQ提供程序格式的数据。

LINQ主要包含以下三部分:

1、LINQ to Objects      主要负责对象的查询。

2、LINQ to XML           主要负责XML的查询。

3、LINQ to ADO.NET   主要负责数据库的查询。

  LINQ to SQL

  LINQ to DataSet

  LINQ to Entities

三、LINQ的优势

1、熟悉的语言:开发人员不必为每种类型的数据源或数据格式学习新的语言。

2、更少的编码:相比较传统的方式,LINQ减少了要编写的代码量。

3、可读性强:LINQ增加了代码的可读性,因此其他开发人员可以很轻松地理解和维护。

4、标准化的查询方式:可以使用相同的LINQ语法查询多个数据源。

5、类型检查:程序会在编译的时候提供类型检查。

6、智能感知提示:LINQ为通用集合提供智能感知提示。

7、整形数据:LINQ可以检索不同形状的数据。

LINQ教程一:LINQ简介相关推荐

  1. 光脚丫学LINQ(014):LINQ to SQL简介

    视频演示:http://u.115.com/file/f29f7838f6 LINQ to SQL 是 .NET Framework 3.5 版的一个组件,提供了用于将关系数据作为对象管理的运行时基础 ...

  2. Linq初级班 Linq To XML体验(基础篇)

    LINQ To XML体验(基础) 这两天开始学习LINQ to XML的知识,我会继续把自己的感想和示例发布给初学者们学习的,一样欢迎高手们多多指点,请勿使用过激语言,针锋相对,我是个初学者,自知还 ...

  3. LINQ圣经——《LINQ实战》

    媒体评论 本书作者是 LINQ 社区中的重要成员,他们在书中展示了这一技术的精髓--快去享受这一盛宴吧. --Matt Warren ,微软主架构师, LINQ 之父 LINQ 方面的杰作!深入.全面 ...

  4. 从LINQ开始之LINQ to Objects(下)

    前言 上一篇<从LINQ开始之LINQ to Objects(上)>主要介绍了LINQ的体系结构.基本语法以及LINQ to Objects中标准查询操作符的使用方法. 本篇则主要讨论LI ...

  5. WPF教程一:基础(转)

    WPF教程一:基础 一.WPF简介 WPF:WPF即Windows Presentation Foundation,翻译为中文"Windows呈现基础",是微软推出的基于Windo ...

  6. Pro LINQ 之三:LINQ to DataSet

    写在前面 将LINQ to DataSet单独放一篇,是因为随后的LINQ to SQL默认只支持MS SQL Server.只有LINQ to DataSet能在没有相应Data Provider帮 ...

  7. 从LINQ开始之LINQ to Objects(上)

    LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. LINQ体系结构 从上图可以看出,LIN ...

  8. AUTOCAD自学教程一

    AUTOCAD自学教程一 AUTOCAD自学教程 在学习任何一款软件的时候,第一步也是非常必要的一步就是如何的安装软件. 下面我们讲解如何的安装这个软件. 1.安装autocad 2.安装产品 3.正 ...

  9. LINQ系列:LINQ to SQL Exists/In/Any/All/Contains

    1. Any 返回没有Product的Category var expr = from c in context.Categorieswhere !c.Products.Any()select c; ...

最新文章

  1. word2vec的数据结构
  2. JavaSE(十六)——反射
  3. 3.21-22 od、tee
  4. IllegalThreadStateException
  5. Python装饰器(二)
  6. Atitit.eclipse git使用
  7. 【复习笔记】Cache的映像方法
  8. 公开薪资后,我会被解雇吗?
  9. [Java] 蓝桥杯ALGO-59 算法训练 快速排序
  10. eclipse中配置heritrix1.14.3
  11. react 项目 测试
  12. 移植基于Qt4.4-tp1的WebKit到ARM平台
  13. CREO:CREO软件之工程图【注释】之尺寸、注解、表面粗糙度、符号、几何公差的简介及其使用方法(图文教程)之详细攻略
  14. Qt开发经验小技巧196-200
  15. java 音频 网络传输_如何流式传输音频?
  16. MySQL 数据库崩溃(crash)的常见原因和解决办法
  17. Delphi皮肤控件分析与QQ的皮肤变色功能
  18. Android项目开发:指南针(两种方法实现)
  19. ACPI相关(7)- ACPI对ata的管理
  20. Windows XP刻录

热门文章

  1. 各种图片格式综述(转载)
  2. 【数据库架构】什么是 OLTP?
  3. 科技型中小企业认定标准
  4. 五、组织机构模块-部门管理
  5. chatbot_Chatbot开发简介
  6. android extra_shortcut_icon,Android Shortcut操作(一)
  7. vbs执行ctrl+空格_VBS中解决路径带空格的三种方法
  8. LeetCode5454-子矩阵计算
  9. Fabric 超级账本学习【1】Fabcar网络调用Fabric-Java-SDK进行简单开发 FabCar
  10. matplotlib 入门之Sample plots in Matplotlib