C# 不枚举字段的Linq到DataTable

C# 不枚举字段的Linq到DataTable,c#,linq,datatable,anonymous-types,data-access,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 我需要下面的返回类型 System.Data.EnumerableRowCollec

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

var linqdata = from ItemA in ItemData.AsEnumerable()
select ItemA
但返回类型是

System.Data.EnumerableRowCollection<System.Data.DataRow>
System.Data.EnumerableRowCollection
我需要下面的返回类型

System.Data.EnumerableRowCollection<<object,object>>
System.Data.EnumerableRowCollection
(与标准匿名类型类似)

有什么想法吗?
谢谢

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

匿名类型看起来像某种变体或动态对象,但实际上它是在编译时定义的强类型类。NET在后台自动为您定义类型。为了使.net能够做到这一点,它必须从代码中获得一些线索,从而推断类型定义。它必须有类似于:

from ItemA in ItemData.AsEnumerable()
select ItemA.Item("Name"), ItemA.Item("Email") 
因此,它知道要定义哪些成员。没有办法绕过它,信息必须在逻辑上存在,才能定义匿名类型

这取决于你为什么要这么做,有一些选择

  • 如果希望intellisense同时仍封装数据访问,则可以从封装的数据访问类返回xml而不是datatable。(您可以非常轻松地将数据表转换为xml。您需要使用新的System.xml.Linq类,如。它们很棒!)然后您可以使用VS2008的功能从xml创建xsd模式。然后在代码页顶部使用/导入该模式,您就拥有了intellisense
  • 如果您必须拥有一个具有数据属性的对象,但又不想为其定义类/结构,那么您会喜欢C#4.0/VB10中新推出的动态对象。您有基于sql返回的对象属性,但没有intellisense。这也会带来性能成本,但(a)这可能与您的情况无关,(b)在某些情况下,它实际上并不那么糟糕
  • 如果您只是试图避免做很多类,请考虑在类定义下面的同一代码文件中定义结构/结构。当向结果集中添加更多列时,可以很容易地调整具有更多公共字段的结构

简言之,您可以拥有以下三个对象中的任意两个:(a)动态对象,(b)强类型对象,(3)智能感知。但不是所有三个。

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

匿名类型看起来像某种变体或动态对象,但实际上它是在编译时定义的强类型类。NET在后台自动为您定义类型。为了使.net能够做到这一点,它必须从代码中获得一些线索,从而推断类型定义。它必须有类似于:

from ItemA in ItemData.AsEnumerable()
select ItemA.Item("Name"), ItemA.Item("Email") 
因此,它知道要定义哪些成员。没有办法绕过它,信息必须在逻辑上存在,才能定义匿名类型

这取决于你为什么要这么做,有一些选择

  • 如果希望intellisense同时仍封装数据访问,则可以从封装的数据访问类返回xml而不是datatable。(您可以非常轻松地将数据表转换为xml。您需要使用新的System.xml.Linq类,如。它们很棒!)然后您可以使用VS2008的功能从xml创建xsd模式。然后在代码页顶部使用/导入该模式,您就拥有了intellisense
  • 如果您必须拥有一个具有数据属性的对象,但又不想为其定义类/结构,那么您会喜欢C#4.0/VB10中新推出的动态对象。您有基于sql返回的对象属性,但没有intellisense。这也会带来性能成本,但(a)这可能与您的情况无关,(b)在某些情况下,它实际上并不那么糟糕
  • 如果您只是试图避免做很多类,请考虑在类定义下面的同一代码文件中定义结构/结构。当向结果集中添加更多列时,可以很容易地调整具有更多公共字段的结构

简言之,您可以拥有以下三个对象中的任意两个:(a)动态对象,(b)强类型对象,(3)智能感知。但并非所有三种方法。

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


韦德

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


Wade

+1匿名类型并不意味着“无类型”或“动态”,它只是意味着代码中没有明确说明该类型。@Kirk谢谢!我想我在这里给出了一个很好的彻底的回答,但在你之前似乎没有人注意到+1匿名类型并不意味着“无类型”或“动态”,它只是意味着代码中没有明确说明该类型。@Kirk谢谢!我想我在这里给出了一个很好的彻底的回答,但在你之前似乎没有人注意到