你能用Linq OrderBy对Typed DataSet DataTables进行排序吗?

时间:2010-10-12 16:04:23

标签: linq sql-order-by strongly-typed-dataset

我有一个Typed DataSet DataTable,它继承了TypedTableBase<T>,后者又实现了IEnumerable<T>。我似乎无法让这个工作。

myDataTable.OrderBy(x => x.ID).ThenBy(y => y.ID2);

相反,我必须将此语句分配给IEnumerable(或列表),然后在我提交之前使用新排序的DataTable手动重新填充IEnumerable。这是它的目的是什么?我已经考虑过创建我自己的扩展方法来清空/重新填充我的DataTables,但这样做是明智的吗?

注意:通常我只需要使用DataView进行排序以进行查看。但在这种情况下,我有一个自定义例程,必须创建一个带有排序要求的新访问数据库,这意味着我需要对实际的DataTable进行排序,以便我可以重新提交它。

谢谢。

2 个答案:

答案 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是一种较旧的技术,并不是最新的和最新的。 “更新”的方法是使用实​​体框架。