相关语言要素
初始值设定项、匿名类型、Lambda表达式、扩展方法
LINQ的概念和基本操作
标准查询运算符
LINQ to Objects概述
初始值设定项、匿名类型、Lambda表达式、扩展方法
由一组只读属性组成的类类型
隐式类型(var)
必须在定义时初始化,不能赋值为null
匿名类型声明和使用:
var 匿名类型变量 = new {公共只读属性组};
匿名类型并不是无类型
匿名类型只是无需预先显式定义
声明匿名类型变量时,通过初始值选项指定的类型,其类型名由编译器生成
是一个匿名函数,可以包含表达式和语句,并且可用于创建委托或表达式目录树类型
Lambda运算符: =>(“goes to”)
*扩展方法定义为单独的命名空间中静态类中的静态方法
System.Collections.IEnumerable 和 System.Collections.Generic.IEnumerable类型添加了LINQ标准查询功能,只要通过using System.Linq指令导入其命名空间
使用using指令将包含扩展方法的命名空间显式导入到源代码
不同数据源使用不同的查询语言,大大增加开发复杂度
LINQ提供一种一致的数据查询模型,用相同的编码模式来查询和转换各种数据源
定义了一组通用标准查询运算符,可以投影、筛选和遍历内存中的集合或数据库中的表
SQL Server 数据库
XML 文档
ADO.NET 数据集
支持IEnumerable或泛型IEnumerable接口的任意对象集合
其他数据源:Web服务和其他数据库(使用第三方的 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,可以直接针对实现IEnumerable或IEnumerable接口的集合,执行LINQ查询,而无需使用中间LINQ提供程序或API
获取数据源
创建查询
执行查询
LINQ 可用于查询和转换字符串和字符串集合
LINQ和文件目录
LINQ非常适用于文件系统操作查询