目录
什么是Linq
语言集成查询(LINQ)是一组技术的名称,而对于编写查询的开发人员来讲,LINQ最明显的语言集成部分就是查询表达式。它是使用C# 3.0中引入的声明性查询语法编写的,有了它,使得你可以使用非常简单的代码对各种数据源进行复杂的筛选、排序、分组等操作。
您可以使用同一个基本查询表达式来查询和转换SQL数据库、ADO.NET数据集、XML文档和流以及.NET集合中的数据。 ————LINQ查询表达式(C#编程指南)
由此可知,Linq使得在对象领域和数据领域为我们搭建了一座桥梁,是检索数据的集大成者。以往我们对数据库、XML、集合需要分别学习对应的知识;例如SQL脚本、对xml文件的操作以及对各种数据结构的集合的方法调用等;而有了Linq,使得我们可以通过Linq查询表达式就可以很方便的游走于各类数据源之间,而且Linq的优点还不止于此。
查询表达式
我们来看看Linq的查询表达式结构图:
查询表达式的概述:
- 查询表达式可用于查询和转换来自任意支持 LINQ 的数据源中的数据
- 查询表达式中的变量都是强类型的,但许多情况下您不需要显式提供类型,因为编译器可以推断类型
- 一些聚合方法如Count、Max等,没有等效的查询表达式子句,因此必须表示为方法调用
- 查询表达式可以编译为表达式树或委托,具体取决于查询所应用到的类型。 IEnumerable 查询编译为委托。 IQueryable 和 IQueryable 查询编译为表达式树
- 拥有延迟执行的特点
检索数据集合
我们先来写两个小例子,看看Linq的查询表达式是如何帮助我们检索数据的
int[] numbers = new int[] { 1, 21, 53, 4, 6435, 32, 6 };
var result = from n in numbers
where n > 50
select n;
foreach (var item in result)
{
Console.WriteLine(item);
}
//输出结果:53,6435
//这里numbers换成任意支持Linq的数据集合都可以,比如List<int>
我们再看一个Dictionary的小例子
Dictionary<int, string> dics = new Dictionary<int, string>();
dics.Add(1, "2");
dics.Add(3, "4");
dics.Add(5, "6");
dics.Add(7, "8");
var resultDic = from n in dics
where n.Key >= 5
select n;
foreach (var item in resultDic)
{
Console.WriteLine(item.Value);
}
//输出结果:6,8
匿名类型
匿名类型的其他优点我们另做讨论,咱们先只在Linq中做个小例子,可以将数据源转换为我们需要的类型结构
代码示例如下:
//假设数据源为产品类
public class Product
{
public double Price { get; set; }
public string Name { get; set; }
}
//我们再新建一个数据集合
List<Product> products = new List<Product>()
{
new Product(){ Price = 2000.0, Name = "CPU"},
new Product(){ Price = 300.0, Name = "GPU"},
};
var result = from p in products
select new { Info = string.Format("产品名称为:{0},它的价格是:{1}", p.Name, p.Price) };
//输出结果为:
//产品名称为:CPU,它的价格是:2000
//产品名称为:GPU,它的价格是:300
延迟执行
Linq的查询操作分为三个部分
1.获取数据源
2.创建查询
3.执行查询
这也是Linq延迟执行的关键所在,就是将查询语句的创建与执行分开管理
以我们第一个简单的例子来说
//第一步获取数据源(XML、SQL皆可)
int[] numbers = new int[] { 1, 21, 53, 4, 6435, 32, 6 };
//第二步创建查询
//这里并没有执行对数据的真实筛选,可以理解为只是编译了查询命令
//比如这里的result变量可以看成是SQL语句:
//select * from numbers where n > 50,但是并未执行,类似视图
var result = from n in numbers
where n > 50
select n;
//第三步执行查询,当对数据源执行遍历或者需要读取数据的时候,才会执行
foreach (var item in result)
{
Console.WriteLine(item);
}
对元素执行聚类函数或转换函数等会使得对Linq表达式强制立即执行,比如Max、Average、First、ToList等
总结
综上所述,Linq帮助我们统一了访问方式,类似ORM框架对应各数据库的方式,让我们对数据的操作非常方便
感谢各位看官,小弟不才,如有不妥之处,还望指出,对我更是帮助