4

ストアド プロシージャからデータを返すがありDataTableます (動的ピボット ステートメントによって生成されますが、関連性はないと思います)。返されたデータには、データのない列が含まれる場合があります。DataViewデータを返さない列を除外する実行時に生成するにはどうすればよいですか?

編集- サンプルデータ

から:

ID  A  B  C
------------
1   1  2  
2   2  4

に:

ID  A  B
---------
1   1  2  
2   2  4

列 C を削除します。データが次のようになっている場合:

ID  A  B  C
------------
1   1     3
2   2     6

次に、列 B を削除する必要があります。

4

1 に答える 1

3

この方法を使用できます:

public static void RemoveNullColumns(ref DataTable tbl, params string[] ignoreCols)
{
    var columns =  tbl.Columns.Cast<DataColumn>()
        .Where(c => !ignoreCols.Contains(c.ColumnName, StringComparer.OrdinalIgnoreCase));
    var rows = tbl.AsEnumerable();
    var nullColumns = columns.Where(col => rows.All(r => r.IsNull(col))).ToList();
    foreach (DataColumn colToRemove in nullColumns)
        tbl.Columns.Remove(colToRemove);
}

あなたのサンプル:

DataTable table = new DataTable();
table.Columns.Add("ID", typeof(int));
table.Columns.Add("A", typeof(int));
table.Columns.Add("B", typeof(int));
table.Columns.Add("C", typeof(int));
table.Rows.Add(1, 1, 2, null);
table.Rows.Add(2, 2, 4, null);

RemoveNullColumns(ref table, "ID");
DataView result = table.DefaultView;

結果 (列「C」を削除):

ID  A   B
1   1   2
2   2   4

元のテーブルを変更せずにコピーを作成するオーバーロードを次に示します。

public static DataTable RemoveNullColumns(DataTable tbl, params string[] ignoreCols)
{
    DataTable copy = tbl.Copy();
    var columns = copy.Columns.Cast<DataColumn>()
        .Where(c => !ignoreCols.Contains(c.ColumnName, StringComparer.OrdinalIgnoreCase));
    var rows = copy.AsEnumerable();
    var nullColumns = columns.Where(col => rows.All(r => r.IsNull(col))).ToList();
    foreach (DataColumn colToRemove in nullColumns)
        copy.Columns.Remove(colToRemove);
    return copy;
}
于 2014-10-07T06:48:37.207 に答える