【问题标题】:What is the best way to use a filtered version of a DataTable?使用 DataTable 的过滤版本的最佳方法是什么?
【发布时间】:2018-02-22 07:38:49
【问题描述】:

我有一个DataSet,其中包含 4 个DataTables,比如dt1dt2dt3dt4。我也有 3 个这样的DataRelations:

|Parent|Child|
|  d1  |  d2 |
|  d2  |  d3 |
|  d2  |  d4 |

我的MasterClass 将此DataSet 传递给几个类,每个类需要使用DataSet 执行不同的操作。但是,在通过DataSet 之前,MasterClass 需要对dt1 执行过滤,因为每个类都需要使用过滤后的dt1 版本。请注意,我无法更新dt1,因为我需要对同一个DataTable 执行不同的过滤器。在下图中,我尝试将结构形象化:

我的问题是:将过滤后的dt1 传递给Class A..B 的最佳方法是什么?

我想到的第一个解决方案是在我的DataSet 中创建dt1 的副本,并将过滤后的版本存储在其中,比如FilteredDt1,但是,我不想有冗余数据/DataRows 在内存中。

根据我在 Microsoft 的文档中阅读的内容,我认为在 DataView 的帮助下我可以做得更好,方法是将 DataView 作为第二个参数传递给类,但我从软件架构的角度来看,我也不知道该怎么做。

遇到的问题

  • 如果我使用DataView,是否仍然可以使用DataRelations?
  • 是否可以在 DataViewDataTable 上运行联接?

我对@9​​87654352@ 比较陌生,如果您纠正我,如果我的问题中有任何错误/不正确的假设,我会非常感激。

【问题讨论】:

    标签: .net datatable architecture ado.net dataview


    【解决方案1】:

    你可以使用 linq:

    var filtered1 = MyDataSet.Tables["d1"].Rows.OfType<DataRow>()
                    .Where(r => r["Column"] = value);
    
    var filtered2 = MyDataSet.Tables["d1"].Rows.OfType<DataRow>()
                    .Where(r => r["OtherColumn"] = differentValue);
    

    现在filtered1 将返回IEnumerable&lt;DataRow&gt; 其中Column = value,
    filtered2 将返回IEnumerable&lt;DataRow&gt; 其中OtherColumn = differentValue

    并且您的原始数据表保持不变。

    请注意,我必须先使用OfType 扩展方法,然后才能使用Where 扩展方法,因为Rows 属性的类型为DataRowCollection,它不实现通用IEnumerable&lt;T&gt; 接口,仅非通用的IEnumerable(和ICollection)接口。

    更新:

    寻找一种在不更改源数据表的情况下返回过滤数据表的方法我遇到了DataTable 类的AsEnumerable 扩展方法,它返回一个IEnumerable&lt;DataRow&gt;(),所以我的建议可以简化为@ 987654342@.

    此外,我还为您找到了一种方法来创建仅包含过滤行的数据表的副本。你要做的是使用接受DataTableRowFilterSortDataViewRowStateDataView constructor,然后调用它的ToTable方法返回一个新的数据表。
    请注意,这将为内存中的数据行创建新副本,因为DataRow 只能属于单个DataTable

    但是,请注意,我建议使用IEnumerable&lt;T&gt;,其中T 是您创建为DTOs 的特定类型,而不是直接使用DataTable。这将使您的生活更安全、更轻松。

    【讨论】:

    • 过滤后的集合(filtered1filtered2)不是内存中的冗余数据吗?我的意思是他们只指原始的DataRows 还是他们的副本?是否仍然可以使用DataRelations?
    • 据我所知,它们指的是原始数据行。您不能将它们与DataRelation 实例一起使用,因为DataRelation 只知道如何与DataTable 实例一起使用。
    • 非常感谢!我会尝试一下,看看使用RowCollection 是否比使用DataTable 更好。
    • 由于性能和内存原因,我不能将IEnumerable&lt;T&gt; 与特定类型一起使用。关于DataViewTotable方法,其实和创建另一个DataTable没什么区别。
    • 无论如何,我使用了IEnumerable&lt;DataRow&gt;。正如你所说,我在内存中没有这样的冗余对象。但是,我不能使用DataRelations,我认为这没什么大不了的。我想我的想法比要求的要复杂一些;)
    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多