LINQ介绍
LINQ是语言集成查询的缩写(Language Integrated Query)。
LINQ的提出就是为了提供一种跨越各种数据源的统一查询方式-它主要包含4个组件
- Linq to SQL:可以查询基于关系数据库的数据,微软只实现了SQLServer的查询等操作,其他的第三方也实现了很多。
- Linq to DataSet: 查询DataSet中的数据,并能对数据进行增删等操作。
- Linq to XML:该组件可以查询XML文件。
- Linq to Objects:可以查询集合数据,如数组或List等。
名称空间
System.Linq
API
LINQ查询步骤
所有 LINQ 查询操作都由以下三个不同的操作组成:
- 获取数据源
- 创建LINQ查询
-
1. 延迟执行
static void Main(string[] args)
{
//1. 先得有数据源才行,这里用Object的数据源,LINQ都一样
int[] numbers = {5,4,1,3,9,8,6,7,2,0,2,8,6,6,4,3,1,7,5,4,6,2,1,0,3,0,1};
//2. 创建一个LINQ查询
var lowNums = from num in numbers
where num < 5
select num;
//3. 执行查询(延迟执行)
foreach (int i in lowNums)
{
Console.Write(i + " ");
}
}
1.1 图解说明
因为上面的例子是数组,我们要查询的是整型,第二步的 lowNums 其实是一个IEnumerable
类型。实现了这个接口的类才能迭代。 所以第二步的 lowNums 是包含了我们要查询的数据的迭代对象。 第三部就用foreach迭代这个对象,就获取到了值。
2. 立即执行
static void Main(string[] args)
{
//1. 先得有数据源才行,这里用Object的数据源,LINQ都一样
int[] numbers = {5,4,1,3,9,8,6,7,2,0,2,8,6,6,4,3,1,7,5,4,6,2,1,0,3,0,1};
//2. 创建一个LINQ查询
var lowNums = from num in numbers
where num < 7 && num >2
select num;
//3. 立即执行 在linq查询变量后面打点
int[] list = lowNums.ToArray();
}
3. 语法说明
查询以from关键词开头,from后面跟一个范变量(就是给你要查询的那个玩意取个名字) in 后面跟查询的数据源。 where就是查询的条件 条件可以用C#的逻辑操作符,&& || ! …….. 各种操作,和SQL差不多,排序,分组啥的,关键字的子句看官方文档 最后写selelct 后面跟 我要查的那个玩意
4. Linq,Lambda,委托结合起来用
static void Main(string[] args)
{
//1. 现在有一个学生列表,这是数据源
List<Student> stulist = new List<Student>();
stulist.Add(new Student(1, 13, "张飞"));
stulist.Add(new Student(2, 14, "刘备"));
stulist.Add(new Student(3, 11, "关羽"));
stulist.Add(new Student(4, 13, "曹操"));
stulist.Add(new Student(5, 12, "马超"));
//2. linq
var stu = from stus in stulist
where stus.Age == 13
select stus.Name;
//3. 强制执行出一个结果集,年龄等于13的学生的名字的list
List<string> list = stu.ToList<string>();
//3.x 这一步操作等于上面的2,3步操作
list = stulist.Where<Student>(x => x.Age == 13).Select<Student, string>(y => y.Name).ToList<string>();
}
3.x那里用到了lambda和委托 List
.Where (Func(T,bool)):意思根据条件括号里面的条件查询List里面的数据,返回一个IEnumerable 类型的对象。括号里面本来是一个Func委托类型,参数类型是Where的泛型,返回值是bool,这里直接写的lambda表达式。 这里的List是Student类型的,我们要筛选出Student的Age等于13的数据。 。 然后接着上面的操作,Select ()括号里面的是一个Func委托,T是委托参数类型,S是返回值类型。这里的委托简写成Lambda表达式。最后返回的还是一个IEnumerable 类型的对象。 。 上面的链式操作时一种极简写法。还原写法如下:
//这一步查出来了年龄等于13的学生
Func<Student,bool> f1 = x => x.Age == 13;
var IE = stulist.Where<Student>(f1);
//这一步查询出了年龄等于13的学生的名字
Func<Student, string> f2 = x => x.Name;
var IE2 = IE.Select<Student, string>(f2);
list = IE2.ToList<string>();