gpt4 book ai didi

c# - Linq to DataTable 无需枚举字段

转载 作者:太空宇宙 更新时间:2023-11-03 22:24:40 24 4
gpt4 key购买 nike

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

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

但是返回类型是

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

我需要以下返回类型

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

(类似于标准的匿名类型)

有什么想法吗?谢谢

最佳答案

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

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

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

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

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

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

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

关于c# - Linq to DataTable 无需枚举字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1833260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com