如何处理通过LINQ过滤的DataTable的“子集”?

时间:2012-07-04 17:36:44

标签: c# linq system.data.datatable

假设我有一个带有Color列的表。颜色可以有各种值。我有一个C#方法,可以一次处理给定列的项目。因此,我想:

foreach(colorname in mytable.getDistinctColornames)
   monocolorMethod(mytable.getSubTableOnlyContainingRowsWithColor(colorname))

我如何优雅地做到这一点......?

不惜一切代价,我会避免将数据复制回来。向前。我想对数据表有点看法。一个只能“显示”给定列的行和“可写”视图的视图(即当我写入已过滤的子集时,原始表被写入)

编辑:

假设我有一个'Car'表,我想用'Co​​lor'替换所有'Color = Red'车型的'Type'栏中的'Sedan'。

如果给出以下代码,我该怎么做?

DataTable cars (...); // the data

DataView dv = cars.DefaultView;
dv.RowFilter = "Color='Red'";

<在这里,我想循环使用DataView>。以下代码不起作用:

foreach (row in dv.AsEnumerable)
{
  if(row["Type"] == "Sedan")
    row["Type"] = "Truck";
}

编辑2:

发现此http://msdn.microsoft.com/fr-fr/library/system.data.dataview.allowedit.aspx暗示

view.AllowEdit = true;
view[0].BeginEdit();
view[0]["FirstName"] = "Mary";
view[0]["LastName"] = "Jones";
view[0].EndEdit();

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

您是否尝试使用DataView课程?它看起来就像你想要实现的而不使用LINQ:http://msdn.microsoft.com/en-us/library/fdcwwhez

使用示例:

假设有一个名为DataTable的{​​{1}}对象,其中包含4行:

_dt

您可以轻松创建DataView,它不会过滤数据,但会对其执行排序操作:

_dt = new DataTable("") {Columns = {new DataColumn("ID"), new DataColumn("Name"), new DataColumn("Order")}};
_dt.Rows.Add(1, "one", 1);
_dt.Rows.Add(2, "two", 3);
_dt.Rows.Add(3, "three", 2);
_dt.Rows.Add(4, "four", 5);

您还可以在_dv = new DataView(_dt, "", "Order, Name", DataViewRowState.CurrentRows); 中添加新行,因为它在相应的DataView上设置,新行将直接添加到DataTable对象。排序顺序也会更新,新行不会是_dt中的最后一行(因为排序是在订单和名称列上完成的)

DataView

在该代码之后,var newRow = _dv.AddNew(); newRow["ID"] = 5; newRow["Name"] = "five"; newRow["Order"] = 4; newRow.EndEdit(); 中将有5行。编辑行也很简单:

_dt

您还可以使用DataView.Find()DataView.FindRows()方法在var editedRow = _dv[0]; editedRow.BeginEdit(); editedRow["Name"] = "Test"; editedRow.EndEdit(); 中找到一行。