LINQ入门系列.docx
- 文档编号:2795129
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:30
- 大小:550.95KB
LINQ入门系列.docx
《LINQ入门系列.docx》由会员分享,可在线阅读,更多相关《LINQ入门系列.docx(30页珍藏版)》请在冰豆网上搜索。
LINQ入门系列
【序】伟大的LINQ
为什么需要LINQ?
面向对象已经成为了软件开发的主流思想,而几乎每一个工程中都是围绕数据处理做文章的。
传统的ADO.NET已经大展身手,而且取代了老式的ADO,但是,不足之处也凸显出来。
1,处理任何一个简单的任务,都需要大量的步骤和冗长的代码。
2,执行命令,是操作数据的必要步骤。
但是其命令是以字符串格式给出的,也就意味着,如果你使用了它,也就同时无法使用任何编译时检查。
如果字符串中的命令非法,也无法得知。
3,好不容易写完了代码,发现代码中的类,仅仅能适用于SQLSERVER;但是,不同的数据库使用的SQL标准也不一样,SO,你写的代码十有八九无法移植。
当然,已经有了解决方案能搞定这些需求,比如某些对象关系映射工具,但是,他们有着致命缺陷,就是数据源单一。
这样的需求,只有微软能解决,而其他第三方厂商无法做到。
因为,微软可以把数据访问和查询功能,集成到面向对象开发语言之中,比如:
C#,VB.NET。
这样,开发人员就可以使用自己熟悉的开发语言,去访问任何一种数据源类型。
比如:
内存,数据库,XML,XXX。
而不是辛苦的去拼接SQL语句,或者是更多不同标准的SQL语句。
这实在是太痛苦了。
简单的做几个小例子,展示一下LINQ的新特性:
1,操作内存数据
查询内存中的集合,根据条件筛选结果。
string[]words={"hello","beautifulgirl","linq","wonderful","word"};
varshortwords=fromwordinwords
whereword.Length<=5
selectword;
foreach(varwordinshortwords)
Console.WriteLine(word);
当然,代码和传统的操作相比,似乎没见到有什么大的改进,反而让人很奇怪。
有些朋友就疑问了,我用传统的string也可以做的很好,干嘛用LINQ?
突然,需求变更了。
要求按照字母顺序对集合排序,然后按照长度分组,然后按照单词长度逆向排序,然后分组展示结果。
既然有了LINQ,那么就算这个需求再变态,我们也不用担心大量的代码了。
vargroups=fromwordinwords
orderbywordascending
groupwordbyword.LengthintolengthGroups
orderbylengthGroups.Keydescending
selectnew{Length=lengthGroups.Key,Words=lengthGroups};
foreach(vargroupingroups)
{
Console.WriteLine("Wordsoflength"+group.Length);
foreach(stringwordingroup.Words)
Console.WriteLine(""+word);
}
OK,就是这么简单,看结果:
当然,LINQ远远不止这么简单的功能和应用场景。
在我们用途最广泛的数据库访问,和XML操作上,一样能够大展身手,篇幅有限,我简单的介绍下在数据访问上的简单应用。
为了让新人容易操作和理解,我们拿SQLSERVER2000里面自带的数据库Northwind做例子,也省去了建立数据库的时间。
我们用Employees表做实验,表结构如图所示:
OK,需求来了,我们筛选出City=London的Name。
注:
【LINQ可以自动生成实体类和数据访问代码,但是,在这里为了演示,我自己手写这个实体类。
】
[Table(Name="Employees")]
classEmployees
{
[Column]
publicstringFirstName{get;set;}
[Column]
publicstringCity{get;set;}
}
//这里为了简单,映射我只写出所需要的,而不是映射所有的列。
//连接字符串定义;当然,实际开发中,LINQ会自动生成。
stringconnectstring="DataSource=.;InitialCatalog=Northwind;IntegratedSecurity=True";
DataContextdb=newDataContext(connectstring);
//DataContext构造函数需要这个connectstring。
varEmployees=
fromEmpindb.GetTable
whereEmp.City=="London"
selectEmp;
//筛选City等于London的对象
foreach(varEmpinEmployees)
Console.WriteLine(Emp.FirstName);
OK,结果出来了,如图:
我们需要的结果已经筛选完毕。
通过我们的小例子,可以看得出LINQ的优势:
1,自动打开数据库连接并且自己维护;
2,内置SQL查询生成功能;
3,自动执行SQL查询;
4,自动将结果填充到对象;
5,强类型数据访问;
6,开发人员使用自己熟悉的语言操作数据对象,如C#,VB.NET。
传统的ADO.NET,也确实有不足之处:
1,以字符串形式构造SLQ语句;
2,没有编译时检查;
3,松散绑定的参数;
4,弱类型结果集合;
5,代码冗长;
6,需要开发人员额外学习其他技能;
--------------------------------
面向对象的思想和数据与对象之间的阻抗失调,以及对象关系映射,在LINQ提出的解决方案中,都得到了解决。
从传统数据访问API,到基于对象和元数据库的设计,微软站在了风口浪尖上,最终的产品,也确实让人满意。
尤其是在没有使用新的CLR的情况下,把C#和VB.NET的语言特性扩展到这样的程度,让人惊叹,也许,这就是下一个传奇吧。
LINQ入门系列
(一)一个小小小小的场景
上一次,我们通过《伟大的LINQ》了解了LINQ的一些新特性,今天,我们从C#的角度上来分析一下它的扩展。
需求1:
显示当前系统运行的进程列表。
解决方案1:
基于.NET2.0
使用System.Diagnostice.Process类里面的GetProcesses方法即可。
代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Diagnostics;
classProgram
{
staticvoidDisplayProcesses()
{
List
foreach(ProcessprocessinProcess.GetProcesses())
processes.Add(process.ProcessName);
ObjectDumper.Write(processes);
//ObjectDumper是MS的一个辅助类,用来输出结果。
}
staticvoidMain(string[]args)
{
DisplayProcesses();
}
}
代码很简洁,也符合基本规范,还用到了泛型,集重用,类型安全,优化性能与一身。
结果如下:
看上去很美好;突然,需求变了。
。
。
要求显示每个进程的ID,名称,物理内存使用情况。
啥说的没有,咱改呗。
staticclassProgram
{
classProcessData
{
publicInt32Id;
publicInt64Memory;
publicstringName;
}
staticvoidDisplayProcesses()
{
List
foreach(ProcessprocessinProcess.GetProcesses())
{
ProcessDatadata=newProcessData();
data.Id=process.Id;
data.Name=process.ProcessName;
data.Memory=process.WorkingSet64;
processes.Add(data);
}
ObjectDumper.Write(processes);
}
staticvoidMain(string[]args)
{
DisplayProcesses();
}
}
看上去好像更漂亮了。
。
。
有点学院派的风格了。
。
。
哈哈哈哈。
。
。
结果如下:
要是再弄的看上去先进点,就来个自动属性和隐式类型吧。
staticclassProgram
{
classProcessData
{
publicInt32Id{get;set;}
publicstringName{get;set;}
publicInt64Memory{get;set;}
}
staticvoidDisplayProcesses()
{
varprocesses
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINQ 入门 系列
![提示](https://static.bdocx.com/images/bang_tan.gif)