【问题标题】:from an EnumerableRowCollection(Of System.Data.DataRow), assign the table to a variable从 EnumerableRowCollection(Of System.Data.DataRow),将表分配给变量
【发布时间】:2015-11-30 21:51:38
【问题描述】:

我有一个在 EnumerableRowCollection(Of System.Data.DataRow) 中传递的方法,我希望能够使用底层数据表。最终我希望能够使用该数据表的列集合。

目前我使用

Dim t As System.Data.DataTable = TryCast(x(0), DataRow).Table

x is EnumerableRowCollection(Of System.Data.DataRow)

这很好用,除了行数为零的情况。

我确信底层数据表定义仍然存在,因为如果我针对 x '添加观察',我可以通过调试器访问它

在我看到的监视窗口中

x|{System.Data.EnumerableRowCollection(of System.Data.DataRow)}
System.Data.EnumerableRowCollection(of System.Data.DataRow)|{System.Data.EnumerableRowCollection(of System.Data.DataRow)}
ElementType| {Name="DataRow" FullName = "System.Data.DataRow"}
EnumerableRows|In-Memory Query
Table|{mydatatable}

我追求的是mydatatable

如果我尝试 x.Table 然后我得到

'table' 不是 'System.Collections.Generic.IEnumerable(Of System.Data.DataRow)'。

在我的例子中,enumerablerowcollection 很可能是使用带有 orderby 的 LINQ 从数据表创建的

 Dim z = (From d In mydataset.mydatatable.OrderBy(Function(c) c.myfield))

总之,即使 EnumerableRows 的计数为零,我也希望能够从 EnumerableRowCollection(Of System.Data.DataRow) 访问数据表。 如果这是不可能的,那么请你帮我解释一下监视窗口如何显示这个。我可以添加我在监视窗口中看到的图像吗? 我添加了调试器显示的图像,它如何获取此表信息

【问题讨论】:

  • 我这里没有足够的代码来测试想法,但是通过在空集合上调用 AddRow 并为您的列反映新行来“伪造它”怎么样?
  • 我明天会用更有用的代码示例来编辑这个。我正在按照你的想法进行一些探索,如果这能让我到任何地方,我会更新
  • 不,您无法从零大小的集合中获取有关表的信息。您必须通过另一个参数传递表格。
  • 为什么要底层的DataTable?你能不接受DataTable 而不是行集合吗?

标签: .net vb.net linq system.data


【解决方案1】:

没有公开底层DataTable 的公共属性或方法。您在不可公开访问的 internal 属性中看到的 Table 属性。您可以使用反射深入了解这个实现细节:

var pi = rows.GetType().GetProperty("Table",BindingFlags.NonPublic | BindingFlags.Instance);
DataTable dt = pi.GetValue(rows) as DataTable;

但是(希望很明显)这些内部实现细节很脆弱并且可能会发生变化。

由于类本身 is not intended to be used directly from your class,我强烈建议您更改方法以将 DataTable 作为参数而不是这个特定于实现的类。

【讨论】:

  • 谢谢,我已将其更改为将数据表作为参数传递。我没有意识到 EnumerableRowCollection 是禁区。我将在短期内使用它,同时寻找更好的解决方案
  • @thehill 是的,很遗憾AsEnumerable 扩展方法的返回类型返回一个特定的类而不是IEnumerable<TDataRow>。这样他们就可以在不破坏现有代码的情况下更改实际的实现类型。
猜你喜欢
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 2012-08-07
相关资源
最近更新 更多