Получение отфильтрованных данных из dataset в datatable

Как я могу фильтровать данные из dataset в datatable? как код->

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

Как я могу использовать datatable здесь?

следующий код не отражает изменения->

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 не равно NULL " + FilteredDataD.колонки("col_name")... Предположим, у меня есть 5 столбцов, отображающих только 4, я не могу удалить col_name из моего запроса.Есть ли способ?

ответ

2 ответов


попробуйте использовать LINQ вместо:

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

редактировать изменить AsDataView to 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(); 
}

вы можете написать метод расширения (используя 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");