我有一个Typed DataSet DataTable,它继承了TypedTableBase<T>
,后者又实现了IEnumerable<T>
。我似乎无法让这个工作。
myDataTable.OrderBy(x => x.ID).ThenBy(y => y.ID2);
相反,我必须将此语句分配给IEnumerable
(或列表),然后在我提交之前使用新排序的DataTable
手动重新填充IEnumerable
。这是它的目的是什么?我已经考虑过创建我自己的扩展方法来清空/重新填充我的DataTables,但这样做是明智的吗?
注意:通常我只需要使用DataView进行排序以进行查看。但在这种情况下,我有一个自定义例程,必须创建一个带有排序要求的新访问数据库,这意味着我需要对实际的DataTable进行排序,以便我可以重新提交它。
谢谢。
答案 0 :(得分:4)
为了做你想做的事,你必须为你的项目添加以下参考:
<强> System.Data.DataSetExtensions 强>
添加完成后,您可以按照以下顺序订购DataTable:
var query = myDataTable.OrderBy(x => x.ID).ThenBy(y => y.ID2);
// use the DataView generated from the LINQ query
DataView dtv = query.AsDataView();
为了遍历DataView,您可以执行以下操作:
var dtv = query.AsDataView();
foreach(DataRowView rw in dtv)
{
// you can also cast back to the typed data...
MyCustomRowType typedRow = (MyCustomRowType) rw.Row;
// do something here...
}
或者你可以通过这种方式通过LINQ进行类型转换:
var dtv = query.AsDataView().Cast<MyCustomRowType>();
// rowItem is of type MyCustomRowType...
foreach(var rowItem in dtv)
{
// do something here...
}
答案 1 :(得分:2)
Linq扩展方法不会改变可枚举的源。
var numbers = new int[]{1,2,3};
var reversed = numbers.OrderByDescending(x=>x);
foreach(var number in reversed)
Console.Write(number); // 321
foreach(var number in numbers)
Console.Write(number); // 123
如果要对DataTable进行排序,则应使用DataViews。您在DataTable上创建一个视图,然后对其应用排序或过滤器,然后对其进行绑定。请记住,DataSet是一种较旧的技术,并不是最新的和最新的。 “更新”的方法是使用实体框架。