查询表达式总是以from子句开始,以select子句或group by子句结束。
1、select 投射
查询表达式的select子句将from子句的表达式所收集到的东西投射到完全不同的数据类型中:
var fileNames = Directory.EnumerateFiles("D:");
var fileResults = from fileName in fileNames
select
(
Name: fileName,
LastWriteTime: File.GetLastWriteTime(fileName)
);
foreach(var fileResult in fileResults)
{
Console.WriteLine($@"{fileResult.Name}({fileResult.LastWriteTime})");
}
假如数据量非常大,而且检索数据的代价非常高,那么投射可以减少与集合中每一项关联的数据量,效率的提升将非常明显。使用元组执行查询时可以不获取全部数据,而是只在集合中存储和获取需要的数据。
2、where 筛选
用where子句在垂直方向上筛选集合,筛选条件用谓词表示。所谓谓词,本质上就是返回bool值的Lambda表达式。
IEnumerable<FileInfo> files=from fileName in Directory.EnumerateFiles("D:")
where File.GetLastWriteTime(fileName) > DateTime.Now.AddMonths(-3)
select new FileInfo(fileName);
foreach (var item in files)
{
var path = item.FullName;
Console.WriteLine($"{path} ({item.LastWriteTime})");
}
D:\SFGH.docx (2022/8/8 14:41:51)
3、orderby 排序
//首先以文件长度降序,再按文件名排序,多个排序以逗号分割,排序方式默认ascending
IEnumerable<string> fileNames = from fileName in Directory.EnumerateFiles("D:")
orderby (new FileInfo(fileName)).Length descending,fileName
select fileName;
4、let子句 引入单位变量
let子句容纳的表达式值可在查询表达式剩余部分使用。可添加任意数量的let子句,只需把它们放在第一个from子句之后、最后一个select/groupby子句之前。
//多次实例化FileInfo对象,造成无用开销
IEnumerable<FileInfo> files1 = from fileName in Directory.EnumerateFiles("D:")
orderby (new FileInfo(fileName)).Length descending,fileName
select new FileInfo(fileName);
//使用let子句削减开销
IEnumerable<FileInfo> files2 = from fileName in Directory.EnumerateFiles("D:")
let file=new FileInfo(fileName)
orderby file.Length descending, fileName
select file;
5、 group by 分组
LINQ允许将单独的项分组到一系列子集合中,还允许那些组与所查询的集合中的项关联。
IEnumerable<string> Keys =new List<string> {"a.b","ae.c","egf"};
IEnumerable<IGrouping<bool, string>> selection = from word in Keys
group word by word.Contains('.');
foreach (var group in selection)
{
Console.WriteLine(group.Key);
foreach (var item in group)
{
Console.WriteLine(item);
}
}
True
a.b
ae.c
False
egf
6、into 扩展查询
将一个查询作为另一个查询的输入。可以应用于所有的查询表达式。可以链接任意数量的查询。
7、from 平整序列的序列
将序列的序列平整成单个序列
var selection = from word in Keys
from character in word
select character;