LINQ英文全称是“Language-IntegratedQuery”,中文为“语言集成查询”,它是一组 .NETFramework 扩展模块集合,内含语言集成查询、集合以及转换操作。它使用查询的本机语言语法来扩展 C# 和 VisualBasic,并提供利用这些功能的类库。微软从2003年开始启动LINQ的开发,在VisualStudio2008中开始加入LINQ功能。
1.简介
(1)LINQ主要包含以下三部分:
LINQ to Objects 主要负责对象的查询,比如集合、数组、字符串等等。
LINQ to XML 主要负责XML的查询
LINQ to ADO.NET 主要负责数据库的查询,分别有LINQ to SQL、LINQ to DataSet、LINQ to Entities
(2)LINQ要解决的问题
长期以来,开发社区形成以下格局:
面向对象与数据访问两个领域长期分裂,各自为政
编程语言中的数据类型与数据库中的数据类型形成两套体系。例如:
C# 中字符串用 string 表示
SQL 中字符串用NVarchar/Varchar/Char 表示
编码体验落后、没有智能感应、没有严格意义上的强类型和类型检查
SQL 和 XML都有各自的查询语言,而对象没有自己的查询语言
(3)LINQ的表现形式
<span style="font-family:System;font-size:14px;"> //1 普通SQL查询语句
string sql = "select * from T_User where userAge>10";
//2 使用Lambda的Linq查询语句
var ss1 = db.T_User.Where(p => p.userAge > 10);
//3 使用查询语句的Linq查询语句
var ss = from r in db.T_User
where r.userAge > 10
select r;
</span>
2.LINQ
LINQ中的方法说到底都属于额外增加出来的方法.在一定程度上可以说没有扩展方法就没有LINQ,所以先介绍下扩展方法和Lambda表达式
(1).扩展方法:
扩展方法是对已存在类型的行为进行扩展,它是一种特殊的静态方法,且必须在静态类中定义.它的优先级低于同名的类方法,且只在特定的命名空间内有效
<span style="font-family:System;font-size:14px;">publicstaticvoid sPrint(this String val)
{
Console.WriteLine(val);
}</span>
使用String类型的sPrint方法的代码如下:
<span style="font-family:System;font-size:14px;"> var a = "aaa";
a.sPrint();
Console.ReadKey();</span>
本来string类型没有sPrint方法,但是通过上面的代码,就给string类型“扩展”了一个sPrint方法.
(2).Lambda表达式
Lambda表达式 是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。所有 Lambda 表达式都使用 Lambda 运算符 =>;,该运算符读为“goes to”。该 Lambda运算符的左边是输入参数,右边包含表达式或语句块。Lambda 表达式 x => x * x 读作“x goes to x timesx”。并且可将此表达式分配给委托类型,
最基本的Lambda表达式的语法是:
(参数列表) => {方法体}
Lambda表达式是由如下过程一步步发展而来的,Lambda进一步简化匿名方法的写法
委托----->匿名方法----->Lambda表达式
匿名方法的代码如下:
delegate(int a) { Console.WriteLine(a); }
使用lambda表达式的代码如下:
a => Console.WriteLine(a)
其中,a是输入参数,编译器可以自动推断出它是什么类型的,如果没有输入参数,可以写成这样:
() => Console.WriteLine("ddd")
Console.WriteLine(a)是要执行的语句,如果是多条语句的话,可以用{}包起来。在有返回值的情况下,可以直接写return语句
(3).LinQ
1)查询操作符
.net的设计者在类库中定义了一系列的扩展方法来方便用户操作集合对象,这些扩展方法构成了LinQ的查询操作符。这一系列的扩展方法,比如:Where,Max,Select,Sum,Any,Average,All,Concat等,都是针对IEnumerable的对象进行扩展的。也就是说,只要实现了IEnumerable接口,就可以使用这些扩展方法
来看看这段代码:
<span style="font-family:System;font-size:14px;"> List<int> arr =new List<int>() {1, 2,3, 4,5, 6,7 };
var result = arr.Where(a=> {returna > 3;}).Sum();
Console.WriteLine(result);
Console.ReadKey();</span>
这段代码中,用到了两个扩展方法。
Where扩展方法,需要传入一个Func<int,bool>类型的泛型委托,这个泛型委托,需要一个int类型的输入参数和一个布尔类型的返回值。我们直接把a => { return a > 3; }这个lambda表达式传递给了Where方法,a就是int类型的输入参数,返回a是否大于3的结果。
Sum扩展方法计算了Where扩展方法返回的集合的和。
2)查询执行的过程
3)Linq查询的两种方式:
1>查询方法:Method Syntax,查询方法方式
主要利用 System.Linq.Enumerable类中定义的扩展方法和Lambda表达式方式进行查询,在(1)中就是用的这种方式
2>查询语句:Query Syntax,查询语句方式
一种更接近 SQL语法的查询方式,可读性更好,这在开头的LinQ的表现形式中就可以看出来。虽然使用查询操作符表示的扩展方法来操作集合已经很方便了,但从可读性和代码的语义来看仍有不足,所以就产生了查询表达式的写法,(1)中的代码
arr.Where(a => { return a > 3;}).Sum();
这一句完全可以写成如下代码:
(from v in arr where v > 3 selectv).Sum();
两句代码的执行细节是完全一样的,但是后者的可读性要高于前者,且更符合我们的使用SQL时养成的语法习惯,而其中括号内的代码(from v in arr where v > 3 select v)就是一个非常简单的查询表达式
小结:
LINQ的一大特性是可以对多种数据源查询,而且查询的语法相同,这为开发人员处理不同的数据源的数据提供了极大的便利,在开发语言中也直接提供了对LINQ的IntelliSense和调试的支持。它使用一种简化的方式编写查询语句,通过消除运行时错误和捕捉编译时错误减少开发时间,消除了关系数据和面向对象开发之间的障碍。

本文详细介绍了LINQ的全称、用途、表现形式及其关键组件,包括LINQ to Objects、LINQ to XML、LINQ to ADO.NET等。文章还深入探讨了扩展方法、Lambda表达式和LINQ的查询操作符,展示了如何使用这些工具简化数据查询过程,提高代码可读性和效率。
5425





