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

时间:2012-04-25 14:07:17

标签: c# ado.net datatable .net-2.0

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

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

我如何在这里使用数据?

以下代码并未反映更改 - >

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

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

回复

2 个答案:

答案 0 :(得分:11)

尝试使用LINQ:

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

编辑AsDataView更改为AsDataView()以确保语法准确性。
编辑提供与.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(); 
}

答案 1 :(得分: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;
}

然后使用它如下:

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

更新,因为您说您正在使用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");