文章目录
一、LINQ
LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源。
LINQ包括五个部分:LINQ to Objects、LINQ to DataSets、LINQ to SQL、LINQ to Entities、LINQ to XML。
- LINQ to Objects:用于处理数组和集合
- LINQ to Entities:在通过Entity Framework技术访问数据库时使用
- LINQ to SQL:MS SQL Server中的数据访问技术
- LINQ to XML:在处理XML文件时使用 LINQ to DataSet:在使用DataSet对象时使用 Parallel
- LINQ(PLINQ):用于执行并行查询
这里介绍LINQ to Objects:用于处理数组和集合的操作。
1.1 LINQ用两个查询用法
查询表达式(Query Expression)和方法查询(Fluent Syntax)。
1.2 LINQ常用关键字
关键字 | 含义 |
---|---|
from | 指定数据源和范围变量 |
where | 根据布尔表达式(由逻辑与 或 等组成)从数据源中筛选元素 |
select | 指定查询结果中的元素所具有的类型或表现形式 |
group | 对对查询结果按照键值进行分组 |
into | 提供一个标示符,它可以充当对 join group 或 select 子句结果的引用 |
orderby | 对查询出的元素进行排序 |
join | 按照两个指定匹配条件来联接俩个数据源 |
let | 产生一个用于查询表达式中子表达式查询结果的范围变量 |
其他实际使用用查询。
二、运用LINQ
2.1 初始化数据
//初始化masterList 列表
var masterList = new List<MartialArtsMaster>()
{
new MartialArtsMaster() {Id = 1, Name = "黄蓉", Age = 18, Menpai = "丐帮", Kongfu = "打狗棒法", Level = 9},
new MartialArtsMaster() {Id = 2, Name = "洪七公", Age = 70, Menpai = "丐帮", Kongfu = "打狗棒法", Level = 10},
new MartialArtsMaster() {Id = 3, Name = "郭靖", Age = 22, Menpai = "丐帮", Kongfu = "降龙十八掌", Level = 10},
new MartialArtsMaster() {Id = 4, Name = "任我行", Age = 50, Menpai = "明教", Kongfu = "葵花宝典", Level = 1},
new MartialArtsMaster() {Id = 5, Name = "东方不败", Age = 35, Menpai = "明教", Kongfu = "葵花宝典", Level = 10},
new MartialArtsMaster() {Id = 6, Name = "林平之", Age = 23, Menpai = "华山", Kongfu = "葵花宝典", Level = 7},
new MartialArtsMaster() {Id = 7, Name = "岳不群", Age = 50, Menpai = "华山", Kongfu = "葵花宝典", Level = 8},
new MartialArtsMaster() {Id = 8, Name = "令狐冲", Age = 23, Menpai = "华山", Kongfu = "独孤九剑", Level = 10},
new MartialArtsMaster() {Id = 9, Name = "梅超风", Age = 23, Menpai = "桃花岛", Kongfu = "九阴真经", Level = 8},
new MartialArtsMaster() {Id = 10, Name = "黄药师", Age = 23, Menpai = "梅花岛", Kongfu = "弹指神通", Level = 10},
new MartialArtsMaster() {Id = 11, Name = "风清扬", Age = 23, Menpai = "华山", Kongfu = "独孤九剑", Level = 10}
};
//初始化功夫kongfuList
var kongfuList = new List<Kongfu>()
{
new Kongfu() {Id = 1, Name = "打狗棒法", Power = 90},
new Kongfu() {Id = 2, Name = "降龙十八掌", Power = 95},
new Kongfu() {Id = 3, Name = "葵花宝典", Power = 100},
new Kongfu() {Id = 4, Name = "独孤九剑", Power = 100},
new Kongfu() {Id = 5, Name = "九阴真经", Power = 100},
new Kongfu() {Id = 6, Name = "弹指神通", Power = 100}
};
2.2 筛选Where与Select
Where方法提供了我们对于一个集合的筛选功能,Select方法可以查询投射,返回新对象集合。这里,假设我们先筛选出所有男性集合,再根据男性集合中所有项的姓名生成子集合(这是一个不同于原类型的类型),就可以借助Select方法来实现。
使用LINQ做查询( 表达式写法)
查询等级大于8,并且门派为“丐帮”的数据。
//1、表达式写法
var res1 = from m in masterList
//from后面设置查询的集合
where m.Level > 8 && m.Menpai == "丐帮" //通过&&添加并列的条件
//where后面跟上查询的条件
select m;//表示m的结果结合返回
//2、扩展方法的写法
var res2 = masterList.Where(m => m.Level > 8 && m.Menpai == "丐帮");
//输出,res1和res2其实内容一样
foreach (var temp in res2)
{
Console.WriteLine(temp.Name);
}
//黄蓉 洪七公 郭靖
3.3 LINQ 联合查询
//取得所学功夫的杀伤力大于90 的武林高手
var res = from m in masterList
join k in kongfuList on m.Kongfu equals k.Name
where k.Power > 90
select new { id=m.Id, name=m.Name,kongfu=m.Kongfu,power=k.Power};
3.4,对查询结果做排序 orderby (descending)
OrderByDescending降序。
//1、表达式写法
var res = from m in masterList
//from后面设置查询的集合
where m.Level > 8 && m.Menpai == "丐帮" //通过&&添加并列的条件
//orderby m.Age descending
orderby m.Level, m.Age //按照多个字段进行排序,如果字段的属性相同,就按照第二个属性排序
//where后面跟上查询的条件
select m;//表示m的结果结合返回
//2、扩展方法的写法
var res2 = masterList.Where(m => m.Level > 8 && m.Menpai == "丐帮").OrderBy(m =>m.Level).ThenBy(m => m.Age);
3.5 按照自身字段分组 group
var res = from m in masterList
group m by m.Kongfu
into g
select new {count = g.Count(), key = g.Key};//g.Key Key表示是按照那个属性分的组
3.6 量词操作符 any all 判断集合中是否满足某个条件
bool res = masterList.Any(m => m.Menpai == "丐帮");
Console.WriteLine(res); //true
bool res1 = masterList.All(m => m.Menpai == "丐帮");
Console.WriteLine(res1); //false