语言集成查询LINQ
- 前言
- 相关语言要素
- 初始值设定项
- 匿名类型
- 相关语言要素
- Lambda表达式
- 扩展方法
- LINQ的概念和基本操作
- 集成语言查询LINQ
- LINQ查询操作
- 标准查询运算符
- 数据排序
- 数据筛选
- 数据投影
- 数据分组
- 联接运算
- 数据分区
- 限定运算
- 聚合运算
- 集合运算
- 生成运算
- 元素操作
- 串联运算
- 相等运算
- 数据类型转换
- LINQ to Objects概述
- LINQ和字符串
前言
-
相关语言要素
初始值设定项、匿名类型、Lambda表达式、扩展方法 -
LINQ的概念和基本操作
-
标准查询运算符
-
LINQ to Objects概述
相关语言要素
初始值设定项、匿名类型、Lambda表达式、扩展方法
初始值设定项
- 初始值设定项特别适用于LINQ 查询表达式
- 匿名类型只能使用对象初始值设定项进行初始化
匿名类型
-
由一组只读属性组成的类类型
-
隐式类型(var)
必须在定义时初始化,不能赋值为null -
匿名类型声明和使用:
var 匿名类型变量 = new {公共只读属性组};
相关语言要素
-
匿名类型并不是无类型
-
匿名类型只是无需预先显式定义
-
声明匿名类型变量时,通过初始值选项指定的类型,其类型名由编译器生成
Lambda表达式
-
是一个匿名函数,可以包含表达式和语句,并且可用于创建委托或表达式目录树类型
-
Lambda运算符: =>(“goes to”)
- 常用在基于方法的LINQ查询中,作为诸如where等标准查询运算符方法的参数
扩展方法
- 扩展方法向现有类型“添加”方法,而无需修改原类型的代码(或创建新的派生类型)并重新编译
*扩展方法定义为单独的命名空间中静态类中的静态方法
-
System.Collections.IEnumerable 和 System.Collections.Generic.IEnumerable类型添加了LINQ标准查询功能,只要通过using System.Linq指令导入其命名空间
-
使用using指令将包含扩展方法的命名空间显式导入到源代码
LINQ的概念和基本操作
集成语言查询LINQ
-
不同数据源使用不同的查询语言,大大增加开发复杂度
-
LINQ提供一种一致的数据查询模型,用相同的编码模式来查询和转换各种数据源
-
定义了一组通用标准查询运算符,可以投影、筛选和遍历内存中的集合或数据库中的表
-
SQL Server 数据库
-
XML 文档
-
ADO.NET 数据集
-
支持IEnumerable或泛型IEnumerable接口的任意对象集合
-
其他数据源:Web服务和其他数据库(使用第三方的 LINQ 提供程序
LINQ查询操作
-
获取数据源
-
创建查询
-
执行查询
//步骤1. 获取数据源
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
//步骤2. 创建查询:从整数数组中返回所有偶数
//方法1:使用查询方法声明查询变量
var numQuery1 = numbers.Where((num) => (num % 2) == 0);
//方法2:使用查询表达式声明查询变量
var numQuery2 = //查询变量(用以存储查询)
from num in numbers //必须以from子句开头:指定数据源和范围变量
where (num % 2) == 0 //筛选子句(可选)
select num; //必须以select子句(选择对象序列)或group子句(分组)结尾
//步骤3. 执行查询并显示查询结果
Console.Write("numQuery1内容如下:");//方法1(查询表达式)查询结果
foreach (var num in numQuery1) Console.Write("{0,1} ", num);
Console.Write("\nnumQuery2内容如下:"); //方法2(查询方法)查询结果
foreach (var num in numQuery2) Console.Write("{0,1} ", num);
标准查询运算符
数据排序
- 排序操作按一个或多个属性对序列的元素进行排序
- 第一个排序条件对元素执行主要排序
- 第二个排序条件则对主要排序结果再进行排序
string[] words = { "the", "quick", "brown", "fox", "jumps" };
foreach (var w in words) Console.Write("{0} ", w);
var q1 = from w in words orderby w.Length descending, w.Substring(0, 1) descending select w;
foreach (var w in q1) Console.Write("{0} ", w);
var q2 = words.OrderByDescending(w => w.Length).ThenByDescending(w => w.Substring(0, 1));
foreach (var w in q2) Console.Write("{0} ", w);
数据筛选
筛选操作将结果集限制为只包含那些满足指定条件的元素
OfType, Where(where)
数据投影
对属性执行数学函数)以构建仅包含必须属性的新类型
Select(select), SelectMany
将对象转换为一种新形式的操作,通过映射属性(直接映射、或
数据分组
将数据按共享公共属性进行分组,以便对每个组中的元素进行处理
GroupBy(group…by, group…by…into…)
int[] numbers = { 35, 44, 200, 84, 3987, 4, 199, 329, 446, 208 };
var q1 = from n in numbers group n by n % 2;
var q2 = numbers.GroupBy(n => n % 2);
联接运算
将一个数据源中的对象与另一个数据源中共享某个公共属性的对象关联起来
Join, GroupJoin,…
var q12 = categories.Join(products, c => c.ID, p => p.categoryID, (c, p) => new { CategoryName = c.Name, ProductID = p.ID, ProductName = p.Name });
var q22 = categories.GroupJoin(products, c => c.ID, p =>p.categoryID,(c, ps) => new { CategoryName = c.Name, Nums = ps.Sum(p => p.num) });
数据分区
在不重新排列元素的情况下,将输入序列划分为两部分,然后返回其中一个部分
Skip, SkipWhile, Take, TakeWhile
限定运算
返回一个 Boolean 值,该值指示序列中是否有一些元素满足条件或是否所有元素都满足条件
All, Any, Contains
聚合运算
从数据集计算单个值
Average, Count, Max, Min, Sum,…
集合运算
针对2个集合进行相应的集合运算
Distinct, Except, Intersect, Union
生成运算
用于创建新的值序列
DefaultIfEmpty, Empty, Range, Repeat
元素操作
从一个序列返回单个特定元素
First, Last, Single, ElementAt,…
串联运算
将一个序列追加到另一个序列
Concat
相等运算
比较两个序列,如果两个序列的对应元素相等且这两个序列具有相同数量的元素,则这两个序列相等
SequenceEqual
数据类型转换
更改输入对象的类型
OfType, ToArray, ToList, …
LINQ to Objects概述
-
通过LINQ to Objects,可以直接针对实现IEnumerable或IEnumerable接口的集合,执行LINQ查询,而无需使用中间LINQ提供程序或API
-
获取数据源
-
创建查询
-
执行查询
LINQ和字符串
-
LINQ 可用于查询和转换字符串和字符串集合
-
LINQ和文件目录
LINQ非常适用于文件系统操作查询