博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LINQ之路 1: LINQ介绍
阅读量:7113 次
发布时间:2019-06-28

本文共 3243 字,大约阅读时间需要 10 分钟。

LINQ是.NET Framework 3.5的新特性,其全称是 Language Integrated Query,即语言集成查询,是指将查询功能和语言结合起来。从而为我们提供一种统一的方式,让我们能在C#或VB.NET语言中直接查询和操作各种数据。

 

LINQ的作用

作为软件开发人员,我们很大一部分时间都花在了获取和操作数据上面。而说到数据,我们会自然而然地想到包含在关系数据库里的信息、使用的XML文档、保存在本地的DataSet、内存中的List列表等等。通常我们会对数据进行过滤和定位,查询出符合要求的那一部分数据。

在.NET 3.5之前的版本中,与特定的数据类型打交道时,我们要使用特定特定命名空间下的特定类型。如下表列出了操作各种常见类型的API

目标数据

操作数据的.NET类型

关系数据

System.Data.dll和System.Data.SqlClient.dll

XML文档数据

System.Xml.dll

元数据

System.Reflection命名空间

内存对象集合

System.Array和   System.Collection/System.Collection.Generic命名空间

虽然这些操作数据的方法本身没有问题,比如我们都会直接使用ADO.NET、XML命名空间、反射服务以及各种集合类型。但是本质的问题在于,这些API的每一种本身只是一座孤岛,提供了很少的集成方式。比如我们可以把ADO.NET DataSet保存为XML,然后通过System.Xml命名空间来操作。但是各API之间没有替代品,我们没法用ADO.NET API来操作XML,也不能用System.Array来操作关系数据。

LINQ(语言级集成查询)的意图就是提供一种统一且对称的方式,让程序员在广义的数据上获取和操作数据。通过使用LINQ,我们能够在C#编程语言内直接创建被称为“查询表达式(query expression)”的实体。这些查询表达式是基于许多查询运算符(query operator)的,而且是有意设计成类似SQL表达式的。并且,查询表达式可以用来与多种数据进行交互,以一种统一的方式来操作各种数据。

严格来说,LINQ是用来描述数据访问总体方式的术语。LINQ to Object是针对实现了IEnumerable<T>的对象的LINQ;LINQ to SQL是针对关系数据库的LINQ;LINQ to XML是针对XML文档的LINQ。

LINQ除了提供一个统一的API来操作各种数据,并且为我们提供了编译时类型检查和动态创建查询表达式的能力。

 

从这里开始

LINQ中最基本的数据单元是sequences和elements。一个sequence是实现了IEnumerable<T>的对象,而一个element是sequence中的每一个元素。如下,names就是一个sequence,”Tom”,“Dick”和”Harry”则是elements。

string[] names = { "Tom", "Dick", "Harry" };

一个查询运算符就是用来转换sequence的方法。一个典型的查询运算符接收一个输入sequence并输出一个转换之后的sequence。在System.Linq.Enumerable类中,总共定义了40来个查询运算符----全部用扩展方法来实现,他们被称为标准查询运算符。

一个查询则是由查询运算符来转换sequence的一个表达式,最简单的查询由一个input sequence和一个查询运算符组成。比如:

string[] names = { "Tom", "Dick", "Harry"   }; // 获取所有长度大于等于4的名字     IEnumerable
filteredNames = System.Linq.Enumerable.Where( names, n => n.Length >= 4); foreach (string n in filteredNames) Console.WriteLine(n); 输出: Dick Harry

因为查询运算符是以扩展方法实现的,所以我们可以直接在names对象上调用Where:

// 获取所有长度大于等于4的名字      IEnumerable
filteredNames = names.Where(n => n.Length >= 4);

我们可以通过使用var关键字来进一步简写我们的query:

var filteredNames = names.Where(n => n.Length >= 4);

注:在初学LINQ时,var关键字可能会影响可读性,特别是在没有IDE和智能提示的时候,因而如果可能,我会在本系列的开始尽量使用确切的返回类型。

大部分查询运算符都接受一个lambda表达式作为参数,lambda表达式决定了查询的行为特性和结果。在上例中,lambda表达式为:

n => n.Length   >= 4

Lambda表达式格式为:(parameters) => expression-or-statement-block

在这里的lambda表达式中,输入参数n对应了names数组的每一个元素,其类型为string。Where运算符要求lambda表达式返回一个bool值,当结果为true时,表示该元素会包含在输出sequence中。这里是Where运算符的方法签名:

public static IEnumerable
Where
(this IEnumerable
source, Func
predicate)

下面的query获取所有包含字母a的名字:

string[] names = { "Tom", "Dick", "Harry" };      IEnumerable
filteredNames = names.Where(n => n.Contains("a")); foreach (string name in filteredNames) Console.WriteLine(name); // Harry

到现在为止,我们通过使用扩展方法和lambda表达式来建立了LINQ query。我们很快就能看到,这种策略非常的灵活和适合query的创建,因为我们可以级联的使用查询运算符。通常,这种方法被称为LINQ方法语法(英文著作中称为fluent syntax)。C#还提供了另外一种书写query的语法,叫做查询表达式语法(英文著作中称为query expression syntax),下面是一个用查询表达式语法建立的query,让我们先睹为快:

IEnumerable
filteredNames = from n in names where n.Contains("a") select n; // Harry

方法语法和查询表达式语法是互为补充的,在之后的LINQ方法语法和查询语法一篇中,我们会详解他们的联系和区别。

 


系列博客导航:

 

转载于:https://www.cnblogs.com/lifepoem/archive/2011/10/25/2223765.html

你可能感兴趣的文章
[ARKit]7-ARKit1.5的图片识别功能
查看>>
上线清单 —— 20 个 Laravel 应用性能优化项
查看>>
nvm 怎么安装 ?
查看>>
LeetCode 406 Queue Reconstruction by Height
查看>>
四种遍历方法你选哪个?
查看>>
LeetCode41.缺失的第一个正数 JavaScript
查看>>
Java设计模式五——单件模式
查看>>
CI第一篇 Jenkins+github fir im 蒲公英pgyer com
查看>>
webpack 搭建 vue 项目
查看>>
当TensorFlow遇上Kubernetes ---中兴通讯人工智能计算平台的技术实践
查看>>
奇怪的 Ruby
查看>>
PAT A1084
查看>>
79. Word Search
查看>>
【Android】RxJava的使用(四)线程控制 —— Scheduler
查看>>
极限编程 (Extreme Programming) - 迭代计划 (Iterative Planning)
查看>>
小程序外卖购物车 直接就能用~
查看>>
Python版设计模式之监听者模式
查看>>
[Spring Security 5.2.0 翻译] 8 Architecture and Implementation
查看>>
使用 Sphinx 撰写技术文档并生成 PDF 总结
查看>>
Fastjson的基本使用方法大全
查看>>