本文在于巩固基础
首先我们看看什么是Linq?Linq能帮我们做什么?
Linq的概念:LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源。
Linq的作用:作为软件开发人员,我们很大一部分时间都花在了获取和操作数据上面。而说到数据,我们会自然而然地想到包含在关系数据库里的信息、使用的XML文档、保存在本地的DataSet、内存中的List列表等等。通常我们会对数据进行过滤和定位,查询出符合要求的那一部分数据,
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对谁适用:
linq的语法通过System.Linq下面的Enumerable类提供支持,通过观察他的签名,你就会发现他为IEnumerable<T>实现了一系列的扩展方法,也就是说,只要是实现了IEnumerable<T>的对象都可以使用Linq的语法来查询。
Linq中的关键字
from join where group into let orderby select
下面我们用多个实例来讲解Linq to object 的用法
先来看看几个关键字的含义:from in where select
class Program { static void Main(string[] args) { var list = new List<int>() { 1, 2, 3, 4, 52, 0, 1, 532, 311, 11, 65, 123, 333, 12, 5, 2, 4 }; var result = from i in list where i > 4 select i; foreach (var i in result) { Console.WriteLine(i); } }
这个如果不用Linq其实可以写成
class Program { static void Main(string[] args) { var list = new List<int>() { 1, 2, 3, 4, 52, 0, 1, 532, 311, 11, 65, 123, 333, 12, 5, 2, 4 }; //var result = from i in list where i > 4 select i; //foreach (var i in result) //{ // Console.WriteLine(i); //} foreach (var i in list) { if (i>4) { Console.WriteLine(i); } } } }
foreach很类似foreach不是吗? in 关键词后面跟着的是你要查询的集合(注意必须IEnumerable<T>,否则需要显式指定局部变量的类型) ,where关键词能够进行筛选,这里是不是很像 if 条件筛选?select 后面跟着的是你想要输出的结果
var list = new List<int>() { 1, 2, 3, 4, 52, 0, 1, 532, 311, 11, 65, 123, 333, 12, 5, 2, 4 }; var result = from i in list where i > 4 select i.GetType();
这里输出大于4结果的类型(有点多余,只是方便大家理解select 关键字)
输出结果:
System.Int32
System.Int32
System.Int32
System.Int32
System.Int32
System.Int32
System.Int32
System.Int32
System.Int32
请按任意键继续. . .
join关键字
类似SQL里的join,Linq中的join子句用于将两个容器的数据以某种关系进行关联。
class Program { static void Main(string[] args) { var students = GetStudents(); var teachers = GetTeachers(); //搜索老师为王二的学生姓名 var result = from s in students join t in teachers on s.TeacherId equals t.TeacherId where t.TeacherName == "王二" select s.StudentName; foreach (var r in result) { Console.WriteLine(r); } } private static List<Student> GetStudents() { var students=new List<Student>() { new Student(1,"张一",1), new Student(2,"张二",1), new Student(3,"张三",1), new Student(4,"张四",2), new Student(5,"张五",2), new Student(6,"李一",2), new Student(7,"李二",3), new Student(8,"李三",3), new Student(9,"李四",3), new Student(10,"李五",3), new Student(11,"李六",3), }; return students; } private static List<Teacher> GetTeachers() { var teachers = new List<Teacher>() { new Teacher(1,"王一"), new Teacher(2,"王二"), new Teacher(3,"王三") }; return teachers; } }
运行结果:
张四
张五
李一
请按任意键继续. . .
into
into子句用于将join或者是group子句的结果进一步持续化,包装成为一个
System.Linq.IGrouping<TKey, TElement>
对象,而且IGrouping继承自IEnumerable<TElement>,可以看出,IGrouping接口提供分组的键和,该键下所包含的集合
group ...by..,
对结果按照指定的条件进行分组
static void Main(string[] args) { var students = GetStudents(); var teachers = GetTeachers(); //搜索老师的TeacherId 分组 var result = from student in students group student by student.TeacherId into g select g.Key; foreach (var r in result) { Console.WriteLine(r); } }
输出结果:
1
2
3
..
let子句用于在查询中添加一个新的局部变量,使其在后面的查询中可见
static void Main(string[] args) { var students = GetStudents(); var teachers = GetTeachers(); //搜索所有的学生姓名 var result = from student in students let s = student.StudentName select s; foreach (var r in result) { Console.WriteLine(r); } }
输出结果:
张一
张二
张三
张四
张五
李一
李二
李三
李四
李五
李六
请按任意键继续. . .