[C#3.0体验]Orcas中内置的LinQ,XLinQ[DLinQ]扩展方法
谁都知道LinQ是随Orcas(VisualStudio2007)的.NET发布的内置的一个扩展方法,其实整个命名空间都是一个扩展方法的库,它允许开发人员对任何数据类型进行查询。大家都认为这是数据查询的趋势,也许以后的SQL语言会慢慢的发展,但我想现如今大家最想看到的是LinQ带给我们的温暖和快乐。微软把这些扩展的方法放在System.Linq命名空间下,当我们创建一个新类型时,你会发现默认的命名空间中多了一个,在.NET2.0及以前的版本中都只有三个命名空间,现在多了个System.Linq。LinQ定义了标准的查询操作符扩展方法,可以为.NET开发人员用来轻松地查询XML,关系数据库,.NET 对象,和任何其他数据结构类型。Let’s go,下面让我们慢慢体会LinQ带给我们的快乐吧!(版本VSMar07CTP)
下面我们来看看LinQ分别对不同类型的数据进行查询,但由于VSMar07CTP有一个BUG,我们再看下面的例子时首先要去掉这个BUG。在我查看M$Connect时发现已经有人提交了这个BUG,就是web.config中编译通不过,其实去掉那个很简单,我们打开web.config找到<compiler>节点,把子节点注释掉,OK去掉了BUG后我们就可以正常的编译调试了,如下:
2 <compilers>
3 <compiler language="c#;cs;csharp" extension=".cs"
type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
4
5 <!--<providerOption name="CompilerVersion" value="v3.5"/>
6 </compiler>-->
7 </compilers>
8 </system.codedom>
9
由于时间和我写作的底限不长,所以我们先看看对.NET的对象和XML使用LinQ的扩展方法,至于数据库让我们在下一次中慢慢体会。我们首先新建一个类,由于能够给出更直观得效果我直接把图给剪辑过来。但是对于在博客上发表可不是一件很好的做法,代码如下:

在这里.NET3.0中类的简化就不多说了,我们可以不必写隐藏变量了,像上面就可以定义一个实体类了。我们可以用.NET 3.0新的类初始化器和集合初始化器对其进行初始化,代码如下:

初始化时会给我们很爽的智能提示,所以写代码比DotNet2.0真的会少很多。
然后我可以使用由System.Linq提供的标准的“Where()”扩展方法来获取这个集合中年龄为24的那些“Person”对象,代码如下:
LinQ扩展了很多方法,在智能提示中就可以看到,此代码运行后返回:
Name:小宋; NickName:Sek;
Name:小孙; NickName:随风随云;
下面是智能提示的界面:
我们还可以体会很多新鲜的功能,但是在这里就不再显示其他的例子,下面我们来看看LinQ扩展方法在XML中的应用。其实我们也可以把它们应用于数据库等数据检索,我们首先来定义一个XML文件,代码如下:
2 <people>
3 <person userID="1">
4 <name>小兵</name>
5 <nickName>网魂小兵</nickName>
6 <age>24</age>
7 </person>
8 <person userID="2">
9 <name>小赖</name>
10 <nickName>QQing</nickName>
11 <age>23</age>
12 </person>
13 </people>
14
对于XML的数据检索有多种方法,在这里我们看看怎样用LinQ来检索数据,要用到这个功能当然要引入命名空间System.Xml.Linq(这也就是传说中的XLinQ,顺便提一下对于数据库的为DLinQ位于System.Data.Linq命名空间下)。[注:如果你找不到这两个空间可以到%Windows%\Microsoft.Net\Framework目录下的3.5里直接引用DLL类库。]
2 IEnumerable<XElement> person = people.Descendants("person")
3 .Where(p => p. Attribute ("userID").Value == "1");
4
以上代码它返回一个“XElement”元素序列,XElemen是没有类型的XML节点元素。我们可以通过LINQ的 Select() 扩展方法来构造数据形状,提供一个使用了新的对象初始化器句法的Lambda 表达式来填充同样的“Person”类:
2
3 IEnumerable<Person> person = people.Descendants("person")
4 .Where(p => p.Attribute("userID").Value == "1")
5 .Select(p => new Person { UserID=Convert.ToInt32(p.Attribute("userID").Value),
6 Name=p.Element("name").Value,
7 NickName=p.Element("nickName").Value,
8 Age=Convert.ToInt32(p.Element("age").Value)
9 });
10
由于我也是个初学者,今天的体验就到此了,最后总要发表一下我的总体感受,LinQ带给我们的功能其实是没得说的,LinQ的强大允许一个可用于所有数据类型(数据库,XML文件,内存中的对象,以及web-services等)的共同的查询编程模型和语法;LinQ是可以组合的,允许开发人员轻松地往查询语法中添加新的方法/操作符,我们可以把我们自己扩展的方法应用其中;LinQ是可扩展的,允许与任何数据提供器类型一起使用,可以和现有的ORM引擎结合……但我觉得扩展方法在智能提示时会让我觉得很乱,当你不要用LinQ时为了让智能提示更清晰还是建议你去除System.Linq命名空间。其他的功能及效果等到后面继续,也就是说欲知后事如何且听下回分解!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架