【问题标题】:Linq to DataTable without enumerating fieldsLinq to DataTable 不枚举字段
【发布时间】:2010-12-22 10:33:54
【问题描述】:

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

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

但返回类型是

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

我需要以下返回类型

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

(像标准的匿名类型)

有什么想法吗? 谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • +1 匿名类型并不意味着'无类型'或'动态',它只是意味着代码中没有明确说明类型。
    • @Kirk 谢谢!我以为我在这里给出了一个很好的彻底答案,但是直到您之前似乎没有人注意到。 :)
    【解决方案2】:

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

    韦德

    【讨论】:

      猜你喜欢
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      相关资源
      最近更新 更多