1

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

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

但返回类型是

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

我需要以下返回类型

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

(像标准的匿名类型)

任何想法?谢谢

4

2 回答 2

4

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

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

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

所以它知道要定义哪些成员。没有办法绕过它,信息必须在逻辑上存在才能定义匿名类型。

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

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

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

于 2009-12-02T18:52:32.637 回答
0

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

韦德

于 2009-12-03T13:13:43.300 回答