Linq到DataTable没有枚举字段

时间:2009-12-02 14:32:10

标签: c# linq datatable anonymous-types data-access

我试图在不指定字段的情况下查询DataTable对象,如下所示:

var linqdata = from ItemA in ItemData.AsEnumerable()
select ItemA

但返回的类型是

System.Data.EnumerableRowCollection<System.Data.DataRow>

我需要以下返回类型

System.Data.EnumerableRowCollection<<object,object>>

(与标准的匿名类型一样)

有什么想法吗? 感谢

2 个答案:

答案 0 :(得分:4)

如果我理解正确,您希望得到一些您不需要在代码中定义但可以强类型方式使用的对象集合。可悲的是,不,你不能。

匿名类型似乎是某种变种动态对象,但它实际上是一个强类型类,定义于编译时间。 .NET在幕后自动定义类型。为了使.net能够做到这一点,它必须从用于推断类型定义的代码中获得一些线索。它必须有类似的东西:

from ItemA in ItemData.AsEnumerable()
select ItemA.Item("Name"), ItemA.Item("Email") 

所以它知道要定义的成员。没有办法绕过它,信息必须在逻辑上用于定义匿名类型。

根据您尝试这样做的原因,有一些选择。

  • 如果您希望在仍然封装数据访问时进行智能感知,则可以从封装的数据访问类中返回xml而不是数据表。 (您可以非常轻松地将数据表转换为xml。您将需要使用新的 System.Xml.Linq 类,如XElement。它们很棒!)然后您可以使用VS2008能够从xml创建xsd架构。然后使用/导入代码页顶部的架构,并且你有智能感知。
  • 如果你必须有一个对象一个包含数据属性但又不想为它们定义类/结构,你会喜欢新的动态对象< / strong>进入C#4.0 / VB10。你有基于sql返回的对象属性,但你不会有intellisense。这也有性能成本,但(a)可能对您的情况无关紧要;(b)在某些情况下实际上并不是那么糟糕。
  • 如果您只是想避免创建很多类,请考虑在类定义下面的同一代码文件中定义结构/结构。当您向结果集添加更多列时,可以轻松调整具有更多公共字段的结构。

简而言之,你可以拥有以下三个中的任何两个 :( a)动态,(b)strontly-typed对象,(3)intellisense。但不是全部三个。

答案 1 :(得分:0)

有一种方法可以实现你想要的,但它需要动态linq的知识。您将在运行时构建查询,然后使用它。我不是专家,从来没有真正玩过它,但这里有一个链接到Scott Guthrie的博客 - Dynamic Linq。希望有所帮助。

瓦德