从数据集中获取过滤后的数据到数据表

pal*_*lak 6 c# datatable ado.net .net-2.0

如何将数据集中的数据过滤到数据表?喜欢代码 - >

DataRow[] dr = DS.Tables[0]
    .Select("STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL");        
Run Code Online (Sandbox Code Playgroud)

我如何在这里使用数据表?

以下代码并不反映变化 - >

DataTable FilteredDataD = DS.Tables[0];
if (FilteredDataD.Rows.Count > 0) {
    FilteredDataD.DefaultView.RowFilter = "STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL";
    FilteredDataD.DefaultView.ToTable();
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用上面的过滤器删除列,例如"STAGENAME ='Develop'和DEVLAPSEDAYS IS NOT NULL"+ FilteredDataD.column("col_name")...假设我有5列只显示4,我不能删除我的查询中的col_name.有办法吗?

答复

Jam*_*son 11

尝试使用LINQ代替:

var table = DS.Tables[0].AsEnumerable().Where(
    r => r.Field<string>("STAGENAME") == "Develop" && r.Field<int?>("DEVLAPSEDAYS").HasValue).AsDataView().ToTable();
Run Code Online (Sandbox Code Playgroud)

编辑AsDataViewAsDataView()了语法准确性.
编辑提供了.NET 2.0兼容的解决方案

DataTable table = DS.Tables[0];
if (table.Rows.Count > 0)
{
    table.DefaultView.RowFilter = "STAGENAME = 'DEVELOP' AND DEVLAPSEDAYS IS NOT NULL";
    table = table.DefaultView.ToTable(); 
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 6

您可以编写一个扩展方法(使用C#3),如下所示:

public static DataTable Filter(this DataTable dataTable, string selectFilter)
{
    var filteredTable = dataTable.Clone();
    var rows = dataTable.Select(selectFilter).ToList();
    rows.ForEach(filteredTable.ImportRow);
    return filteredTable;
}
Run Code Online (Sandbox Code Playgroud)

然后使用如下:

DataTable dataTable = DS.Tables[0]
    .Filter("STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL");
Run Code Online (Sandbox Code Playgroud)

更新,因为你说你正在使用C#2.0(因此扩展方法和LINQ不是一个选项)你可以使用它:

public static DataTable GetFilteredTable(
    DataTable sourceTable, string selectFilter)
{
    var filteredTable = sourceTable.Clone();
    var rows = sourceTable.Select(selectFilter);
    foreach (DataRow row in rows)
    {
        filteredTable.ImportRow(row);
    }
    return filteredTable;
}

DataTable dataTable = GetFilteredTable(
    DS.Tables[0], "STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL");
Run Code Online (Sandbox Code Playgroud)