Linq基础
1.1LINQ简介
LINQ(LanguageIntegratedQuery)是C#3.0语言新增的一个扩展,可以处理非常大的对象集合,这一般需要选择集合的一个子集来完成执行程序的任务。Linq提供了很多扩展方法便于集合的排序、组合和计算查询结果的统计数据。
VS2008带有3个内置的LINQ变体:LinqtoObjectsLinqtoSQLLinqtoXML,它们为不同的数据提供了查询方案:
LinqtoObjects:为任意类型的C#内存对象提供查询,如数组、列表和其它集合类型。
LinqtoSQL:为使用标准SQL数据库查询语言的关系数据库提供查询,如SQLServer、Oracle等数据库。
LinqtoXML:提供XML文档的创建和处理功能。
1.2第一LINQ查询
下面我们使用Linq实现一个对数组的查找功能,代码如下:
示例1
classProgram
{
staticvoidMain(string[]args)
{
string[]names={"alonso","zheng","smith","jones","smythe","small","Ruiz","Hsieh","Jorgenson","Ilyich","singh"};
varresult=fromninnameswheren.StartsWith("s")selectn;
Console.WriteLine("以s开头的名字为:");
foreach(variteminresult)
{
Console.WriteLine(item);
}
}
}
|
示例说明:
(1)命名空间:System.Linq;
(2)用var关键字声明结果变量;var声明的变量不用指定类型,编译器会自动根据结果推断出该类型。这种声明方式只适用于局部变量。
(3)from子句:指定数据源,类似于foreach循环语法
(4)where子句:指定条件,可以在该子句中指定能应用于数据源中各元素的任意布尔表达式。Where是可选的,称为限制运算符。StartsWith()指定以字母“s”开头,类似的还有Length()(长度)、Contains()(包含)。
(5)select子句:指定元素。必须的,指定结果集中有哪些元素。
(6)foreach语句:负责执行Linq查询的代码。result仅保存了执行查询的一个计划,在访问查询结果之前,并没有提取Linq数据,这称为查询的延迟执行。
1.3排序查询结果
用where子句找到感兴趣的数据后,Linq还可以方便的对得到的数据执行进一步处理,例如,给结果重新排序。下面的示例将以字母顺序给上一个查询的结果排序
示例2
staticvoidMain(string[]args)
{
string[]names={"alonso","zheng","smith","jones","smythe","small","Ruiz","Hsieh","Jorgenson","Ilyich","singh"};
varresult=fromninnameswheren.StartsWith("s")orderbynselectn;
Console.WriteLine("以s开头的名字为:");
foreach(variteminresult)
{
Console.WriteLine(item);
}
}
|
示例说明:这个程序与示例1几乎相同,只是在查询子句中增加了一行代码:
orderbyn
即实现了对结果的排序功能。与where子句一样,orderby子句是可选的。
Orderby子句默认为升序,但可以添加descending关键字,指定降序排列。如:
Orderbyndescending;
另外,可以按照任意表达式进行排序,而无需重新编写查询。例如,要按照姓名中的最后一个字母顺序排序,只需添加如下子句:
Orderbyn.Substring(n.Length-1);
1.4合计运算符
运算符
|
说明
|
Count()
|
结果的个数
|
Min()
|
结果中的最小值
|
Max()
|
结果中的最大值
|
Average()
|
数字结果的平均值
|
Sum()
|
所有数字结果的和
|
使用合计运算符会强制立即执行,而不是延迟执行
示例3
classProgram
{
staticvoidMain(string[]args)
{
int[]numbers=CreateNumbers(123456);
varresult=fromninnumberswheren>1000selectn;
Console.WriteLine("大于1000的个数为:"+result.Count());
Console.WriteLine("大于1000的最大数为:"+result.Max());
Console.WriteLine("大于1000的最小数为:"+result.Min());
Console.WriteLine("大于1000的平均数为:"+result.Average());
Console.WriteLine("大于1000的数的和为:"+result.Sum(n=>(long)n));
}
privatestaticint[]CreateNumbers(intcount)
{
Randomrand=newRandom(0);
int[]result=newint[count];
for(inti=0;i<count;i++)
{
result[i]=rand.Next();
}
returnresult;
}
}
|
示例说明:
Sum()注意,在此给Sum()方法传入了一个λ表达式n=>(long)n,以获得所有数字的和。只是Sum()的一个重载。由于和的结果太大,若个只是用Sum()会产生溢出。
1.5查询复杂对象
下面我们利用Linq来查询对象。
示例4
//Student类
classStudent
{
publicintID{get;set;}
publicstringName{get;set;}
publicstringSex{get;set;}
publicintAge{get;set;}
publicintClass{get;set;}
publicoverridestringToString()
{
return"ID:"+ID+"\tName:"+Name+"\tSex:"+Sex+"\tAge:"+Age+"\tClass:"+Class;
}
}
//main方法
staticvoidMain(string[]args)
{
List<Student>list=newList<Student>{
newStudent{ID=1,Name="zhangsan",Sex="男",Age=18,Class=50},
newStudent{ID=2,Name="lisi",Sex="男",Age=18,Class=50},
newStudent{ID=3,Name="wuangwu",Sex="男",Age=20,Class=51},
newStudent{ID=4,Name="zhaoliu",Sex="男",Age=20,Class=52},
newStudent{ID=5,Name="zhouqi",Sex="女",Age=21,Class=52},
newStudent{ID=6,Name="wangba",Sex="女",Age=20,Class=52}
};
varresult=fromstuinlistwherestu.Age==18selectstu;
Console.WriteLine("年龄为18的学员为:");
foreach(varstuinresult)
{
Console.WriteLine(stu);
}
}
|
示例说明:
给示例和其它示例相似,只是查询的集合为对象集合,结果也为对象。
1.6投射:在查询中创建新对象
投射是在Linq查询中从其它数据类型中创建新数据类型的技术术语。Select关键字是投射运算符。
如Sql数据查询语言,select用来从数据表中选择适当的字段,在Linq中select与其类似。例如将示例4中的代码改为如下:
varresult=fromstuinlistwherestu.Age=18selectstu.Name;
|
其运行结果为:
Zhangsan
Lisi
甚至可以通过给select添加表达式,来转换查询中的数据。如:
selectn+1;
selectstu.Name.ToUpper();
但是与sql不同,Linq不允许在select子句中有多个字段,即selectstu.Name,stu.Age这样的形式将产生一个错误。
如果要实现上述情况,需要在select子句中创建一个新对象,来保存查询的结果。
示例5
//修改示例4Main方法
varresult=fromstuinlistwherestu.Age==18selectnew(stu.Name,stu.Age);
Console.WriteLine("年龄为18的学员为:");
foreach(varstuinresult)
{
Console.WriteLine(stu);
}
|
1.7单值选择查询------Distinct
Sql中我们用到过selectdistinct查询,改查询可检索数据中的唯一值,也就是说值不是重复的。在Linq中作用与之类似。例如:
varresult=list.Select(stu=>stu.Class).Distinct();
其结果为:
50
51
52
此示例为方法语法,将在后期降到。需要说明的是Distinct()只能用在方法语法中。
1.8多级排序
处理了带多个属性的对象后,要考虑按多种方式进行排序的问题了,例如我们先按照班级排序,在按照年龄排序。代码如下:
varresult=fromstuinlistorderbystu.Class,stu.Ageselectstu;
结果如下:
还可以给字段添加Descending关键字。如
orderbystu.Class,stu.Age.deseending;
1.9组合查询
在Linq中还可以实现像Sql中的Groupby语句一样的分组统计功能。
varresult=fromstuinlistgroupstubystu.Classintostudentselectnew{Class=student.Key,Count=student.Count()};
varorderresult=fromstudentinresultorderbystudent.Countdescendingselectstudent;
其运行结果为
在组合查询中的数据通过一个键(key)字段来分组,每个组中的所有程序都共享这个字段值,在此例中键字段是Class:
groupstubystu.Class
要计算每个组的数量,应该生成一个新的结果集student:
groupstubystu.Classintostudent
varresult=fromstuinlistgroupstubystu.Classintostudentselectnew{Class=student.Key,Count=student.Count()};
varorderresult=fromstudentinresultorderbystudent.Countdescendingselectstudent;
分享到:
相关推荐
linq基础 linq to sql linq基础 linq to sql
包含linq to xml 、sql等主要基础知识,能对linq技术有所了解
LINQ初体验之LINQ to Object 1 一步一步学Linq to sql(一):预备知识 4 一步一步学Linq to sql(二):DataContext与实体 9 一步一步学Linq to sql(三):增删改 15 一步一步学Linq to sql(四):查询句法 21 ...
LinQ基础知识教程,讲得非常详细,是从一个牛人的博客里面整理出来的,word版的,还有一个进阶教程linq的,在我的资源里面,欢迎下载。
LinQ查询基础入门教程,不错的学习资源,值得下载阅览
基本的查询排序LINQ语句实现,配合博客文章实现LINQ初学者学习使用
LINQ初体验之LINQ to Object 1 一步一步学Linq to sql(一):预备知识 4 一步一步学Linq to sql(二):DataContext与实体 9 一步一步学Linq to sql(三):增删改 15 一步一步学Linq to sql(四):查询句法 21 ...
Linq的入门基础,让你轻松学习linq,好好珍惜吧 对一些基础差的很适合
LINQ查询基础:介绍LINQ的基础,什么是LINQ,如何使用以及表达式及其查询方法
3.1.2 构成LINQ基础的核心元素 62 3.2 序列 63 3.2.1 IEnumerableT接口 63 3.2.2 迭代器回顾 64 3.2.3 延迟查询执行 66 3.3 查询操作符 69 3.3.1 查询操作符是什么 69 3.3.2 标准查询操作符 71 3.4...
数据库 C#linq基础程序程序练习案例.rar
完整的Linq学习资料,从Linq基础到高级ppt,Linq项目实例(两部分Linq1和Linq2)
LINQ基础资料,挺好的,分也不高,下下来相信你不会后悔的
自己写的一点LINQ的东西和大家分享一下。
出版日期:2009-5-1 ISBN:9787302200253 字数:661000 页码:427 -------------------------------------------------------------------------------- 本书介绍微软最前沿的数据查询编程技术,内容由160个知识点...
C#3.0 Linq基础学习与高级应用技巧教程
详细的Linq学习资料,从低级的Linq基础到高级的ppt,Linq项目(二)
天轰穿老师VS2010趣味编程视频教程,第34讲,LINQ基础语法(一),FLV格式,压缩包自带10%恢复记录
第1章 LINQ项目 1.1 LINQ概述 1.2 标准查询操作符 1.3 LINQ to XML概述 1.4 LINQto SQL概述 1.5 本章小结 第2章 Visual Studio 2008简介 2.1 Visual Studi0 2008 2.2 语言相关的LINQ特性 2.3 ...
Linq基础全面介绍,详细介绍Linq的语言、以及使用