一、为什么要使用LINQ

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

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

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace LinqOfSelectOperation
{
class Program
{
static void Main(string[] args)
{
// 查询出数组中的偶数并排序
int[] ints = { , , , , , , , };
// 定义一个整数类型的集合,用来存放数组中的偶数
List<int> list = new List<int>();
// 遍历数组查询出偶数放到集合中
foreach (int i in ints)
{
// 如果是偶数,把偶数加入到集合中
if (i % == )
{
list.Add(i);
}
} // 正序排序
list.Sort();
// 反转
list.Reverse();
// 输出
Console.WriteLine(string.Join(",",list)); Console.ReadKey();
}
}
}

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

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace LinqOfSelectOperation
{
// 定义委托
delegate bool FindEven(int item); class IntExtension
{
public static int[] where(int[] array, FindEven dele)
{
int[] result=new int[];
int i = ;
foreach (int item in array)
{
if (dele(item))
{
result[i]=item;
i++;
}
} return result;
}
}
class Program
{
static void Main(string[] args)
{
// 查询出数组中的偶数并排序
int[] ints = { , , , , , , , }; //delegate(int item){return item % 2 == 0;}表示委托的实现
List<int> list = IntExtension.where(ints, delegate(int item)
{
return item % == ;
}).ToList();
// 正序排序
list.Sort();
// 反转
list.Reverse();
// 输出
Console.WriteLine(string.Join(",", list)); Console.ReadKey();
}
}
}

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

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace LinqOfSelectOperation
{
// 定义委托
delegate bool FindEven(int item); class IntExtension
{
public static int[] where(int[] array, FindEven dele)
{
int[] result=new int[];
int i = ;
foreach (int item in array)
{
if (dele(item))
{
result[i]=item;
i++;
}
} return result;
}
}
class Program
{
static void Main(string[] args)
{
// 查询出数组中的奇数并排序
int[] ints = { , , , , , , , }; //delegate(int item){return item % 2 != 0;}表示委托的实现
List<int> list = IntExtension.where(ints, delegate(int item)
{
return item % != ;
}).ToList();
// 正序排序
list.Sort();
// 反转
list.Reverse();
// 输出
Console.WriteLine(string.Join(",", list)); Console.ReadKey();
}
}
}

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

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

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace LinqOfSelectOperation
{
class Program
{
static void Main(string[] args)
{
// 查询出数组中的奇数并排序
int[] ints = { , , , , , , , }; // 使用LINQ和Lambda表达式查询数组中的偶数
int[] intEvens= ints.Where(p => p % == ).ToArray();
// 使用LINQ和Lambda表达式查询数组中的奇数
int[] intOdds = ints.Where(p => p % != ).ToArray(); // 输出
Console.WriteLine("偶数:" + string.Join(",", intEvens));
Console.WriteLine("奇数:" + string.Join(",", intOdds)); Console.ReadKey();
}
}
}

在上面的例子中可以看到,我们在单个语句中使用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可以检索不同形状的数据。

最新文章

  1. 数据预处理中归一化(Normalization)与损失函数中正则化(Regularization)解惑
  2. JDBC连接数据库
  3. Nginx详解-服务器集群
  4. [Android Tips] 5. INSTALL_PARSE_FAILED_MANIFEST_MALFORMED on Android-2.1
  5. database link
  6. 喝咖啡写脚本,顺便再加一点点CSS语法糖 2.五分钟学会Less
  7. Python标准库之核心模块学习记录
  8. Zabbix源码包安装
  9. ylb:SQL 常用函数
  10. #pragma的用法
  11. Android:ViewPager04
  12. Mac中如何写NTFS的移动硬盘
  13. HashMap工作原理 和 HashTable
  14. javaWeb学习之页面js树
  15. Dockerfile怎么创建镜像
  16. Spring 学习——Spring AOP——AOP配置篇Advice(有参数传递)
  17. uniq命令
  18. 【CF587F】Duff is Mad AC自动机+分块
  19. Unity3D加密流程文档
  20. jqGrid 奇淫巧技

热门文章

  1. 微信小程序四(设置底部导航)
  2. Python 爬虫 数据提取
  3. java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总
  4. Qt解析xml
  5. Win7中安装Windows PowerShell 3.0
  6. 【Android】3.10 热力图功能
  7. cocos2d-x 粒子动作 setTexture
  8. javascript 图片上传缩略图预览
  9. hdoj1075 What Are You Talking About
  10. Objective-C的“多继承”——消息转发