我的DataSet
包含DataTable
个,dt1
,dt2
,dt3
,dt4
。我也有3 DataRelation
这样:
|Parent|Child|
| d1 | d2 |
| d2 | d3 |
| d2 | d4 |
我的MasterClass
将此DataSet
传递给多个班级,每个班级都需要使用DataSet
执行不同的操作。但是,在传递DataSet
之前,MasterClass
需要在dt1
上执行过滤,因为每个类都需要使用过滤版本的dt1
。请注意,我无法更新dt1
,因为我需要在同一DataTable
上执行不同的过滤器。在下图中,我尝试将结构可视化:
我的问题是:将过滤后的dt1
传递给Class A..B
的最佳方法是什么?
我想到的第一个解决方案是在dt1
中创建DataSet
的副本,并将过滤后的版本存储在其中,比如FilteredDt1
,但是,我不知道我想在内存中有冗余数据/ DataRow
。
从我在微软的文档中看到的内容,我认为我可以在DataView
的帮助下做得更好,我将DataView
作为第二个参数传递给类,但我没有得到我怎么做,也从软件架构的角度来看。
问题:
DataRelation
,是否仍然可以使用DataView
?DataView
和DataTable
? 我对ADO.NET
很陌生,如果你纠正我,如果我的问题中有任何错误/错误的假设,我会非常感激。
答案 0 :(得分:0)
您可以使用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<DataRow>
,其中Column = value
,
filtered2
将返回IEnumerable<DataRow>
OtherColumn = differentValue
,
原始数据表保持不变。
请注意,在使用OfType
扩展方法之前,我必须使用Where
扩展方法,因为Rows
属性类型为DataRowCollection
但未实现通用IEnumerable<T>
接口,只有非通用IEnumerable
(和ICollection
)接口。
<强>更新强>
正在寻找一种在不更改源数据表的情况下返回已过滤数据表的方法我遇到DataTable
类的AsEnumerable
扩展方法,它返回IEnumerable<DataRow>()
,所以我的建议可以简化为...MyDataSet.Tables["d1"].AsEnumerable().Where...
。
另外,我找到了一种方法,只使用过滤后的行创建数据表的副本。您所做的是使用接受DataTable
,RowFilter
,Sort
和DataViewRowState
的{{3}},然后调用它的DataView
constructor方法返回一个新的数据表
请注意,这将为内存中的数据行创建新副本,因为DataRow
只能属于单个DataTable
。
但是,请注意我建议使用IEnumerable<T>
,其中T
是您创建的特定类型ToTable
,而不是直接使用DataTable
。这将使您的生活更安全,更轻松。