随笔 - 89, 评论 - 163, 引用 - 33

导航

关于

标签

每月存档

最新留言

广告

 

 [原文作者]Jonathan Aneja

[原文链接]How LINQ to Dataset works in VB

   LINQ的核心要求任何数据源能够被查询,这基本上意味着它必须实现IEnumerable接口(实际情况要更复杂一点,详细的说明请参见Visual Basic 9.0语言规范之11.21.2一节,<Visual Basic 9.0 Language Specification >)。现在,当使用LINQDataset进行工作时我们就有了一个问题:DataTable没有实现IEnumerable,那么我们该如何来对它进行查询?
   如我们昨天<yesterday>所见,Visual Studio 2008中包含有一个名为 System.Data.DataSetExtensions.dllassembly,它定义了一个叫做AsEnumberable()的扩展方法<extension method>。这里是这个方法看上去的样子:
    <Extension()> _
    Public Function AsEnumerable(source As DataTable) As EnumerableRowCollection(Of DataRow)
   基本上,该方法接收一个DataTable,然后返回实现了IEnumberable(Of T)某个东西,然后LINQ就可以用它来构造标准的查询操作符了。因此,你需要做的是 import System.Data(默认情况下项目模板就会把这个做好),然后你就可以通过调用AsEnumberable()来使用LINQ对一个Dataset进行查询了:
   Dim customers = TestDS.Tables("Customers")
 
   Dim franceCustomers = From cust In customers.AsEnumerable() _
                          Where cust!Country = "France" _
                          Select cust
 
   现在,关于LINQVB中的工作方式的有趣事情之一是:你其实并不真正需要为上面的代码去显式的调用AsEnumberable()以通过编译。即使DataTable没有实现IEnumerable,编译器会通过自动查找某些可以将之转换成某种可被查询的东西的方法来帮助你解决这个问题。当VB编译器碰到一个要对某个未实现IEnumberableIEnumerable(Of T)IQueryable、或IQueryable(Of T)的类型进行工作的LINQ查询时,它会依次执行以下工作:
1. 检查该类型上是否有一个标准的Select方法可用;
2. 检查该类型上是否有一个名为AsQueryable的实例方法,该方法应能返回一个可查询的类型;
3. 检查该类型上是否有一个在作用期内的扩展方法AsQueryable,该方法应能返回一个可查询的类型;
4. 检查该类型上是否有一个名为AsEnumerable的实例方法,该方法应能返回一个可查询的类型;
5. 检查该类型上是否有一个在作用期内的扩展方法AsEnumerable,该方法应能返回一个可查询的类型;
 
    如果编译器在任一步中找到了一个匹配的方法,它就会插入一个对该方法的调用。当System.Data这个namespaceImport了以后,编译器在第5步为DataTable找到了一个匹配的,然后为你插入对AsEnumerable的调用。结果,你就可以象这个从101 LINQ Sampleshttp://msdn.microsoft.com/en-us/vbasic/bb688088.aspx)中拿来的示例那样编写对DataSet操作的LINQ:
Dim customers = TestDS.Tables("Customers")
 
Dim franceCustomers = From cust In customers _
                              Where cust!Country = "France" _
                              Select cust
   这里的意思,是你可以通过提供一个能够返回某种可查询的东西的AsEnumerable扩展方法来使得你的类型可以被LINQ使用。
   注意,对于强类型的Dataset,你不需要去调用AsEnumerable,因为它们继承自TypedTableBase(Of T),而后者则实现了IEnumerable。这里VS2008中的一个新类型;在VS2005中,Dataset Designer将会生成从DataTable继承的代码,然后自己去显示的实现IEnumerable

打印 | 张贴于 2008-10-28 14:10:20 | Tag:VB Team Blog  LINQ Cookbook  Converting SQL to LINQ

留言反馈

#LINQ在VB中是如何对Dataset工作的 编辑
LINQ在VB中是如何对Dataset工作的
2008-10-29 22:24:13 | [匿名:]
#LINQ在VB中是如何对Dataset工作的 编辑
LINQ在VB中是如何对Dataset工作的
2008-10-29 22:24:04 | [匿名:]
#LINQ在VB中是如何对Dataset工作的 编辑
LINQ在VB中是如何对Dataset工作的
2008-10-29 22:23:52 | [匿名:]
#LINQ在VB中是如何对Dataset工作的 编辑
LINQ在VB中是如何对Dataset工作的
2008-10-29 22:23:35 | [匿名:]
#LINQ在VB中是如何对Dataset工作的 编辑
LINQ在VB中是如何对Dataset工作的
2008-10-29 22:23:21 | [匿名:]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode.MVC引擎 0.5.2.0