从数据表c#中获取N个列

时间:2018-01-05 05:54:57

标签: c# linq datatable

我有一个数据表,我需要使用n列。例如:从下面的数据表我需要单独使用数据的前10列并将其放在另一个数据表中。

代码:

DataTable dtRecord = DAL.GetRecords();

我尝试了这个,并没有采取所需的列。

var selectColumns = dtRecord .Columns.Cast<System.Data.DataColumn>().Take(10);

4 个答案:

答案 0 :(得分:2)

您也可以使用此

private DataTable GetNColumnsFromDataTable(DataTable tblSource, int outputCols)
    {
        DataTable columnOutput = tblSource.Copy();
        if (outputCols > 0 && outputCols < tblSource.Columns.Count)
        {
            while (outputCols < columnOutput.Columns.Count)
            {
                columnOutput.Columns.RemoveAt(columnOutput.Columns.Count - 1);
            }
        }
        return columnOutput;
    }

答案 1 :(得分:1)

要从一个DataTable复制到另一个var moveCols = dtRecord.Columns.Cast<DataColumn>().Take(10).Select(c => c.ColumnName).ToArray(); ,您可以提取感兴趣的列

DataColumn

然后,您必须在新表中创建新的DataRow,然后在新表中创建新的var newTable = new DataTable(); foreach (var c in moveCols) newTable.Columns.Add(c); foreach (var r in dtRecord.AsEnumerable()) newTable.Rows.Add(moveCols.Select(c => r[c]).ToArray());

DataTable

您可以在public static DataTable Slice(this DataTable dt, params string[] colnames) { var newTable = new DataTable(); foreach (var c in colnames) newTable.Columns.Add(c, dt.Columns[c].DataType); foreach (var r in dt.AsEnumerable()) newTable.Rows.Add(colnames.Select(c => r[c]).ToArray()); return newTable; } 上制作扩展方法:

var newTable = dtRecord.Slice(moveCols);

现在你可以打电话了

Dictionary

使用不错的扩展方法,您可以动态地将DataTable转换为var newTable = dtRecord.AsEnumerable().Select(r => moveCols.ToDictionary(c => c, c => r[c])).AsDataTable();

ExpandoObject

我还有一些转换Dictionary和匿名对象,以及动态转换为匿名对象的扩展。以下是DataTablepublic static DataTable AsDataTable(this IEnumerable<IDictionary<string, object>> rows) { var dt = new DataTable(); if (rows.Count() > 0) { foreach (var kv in rows.First()) dt.Columns.Add(kv.Key, kv.Value.GetType()); foreach (var r in rows) dt.Rows.Add(r.Values.ToArray()); } return dt; } public static DataTable AsDataTable(this IEnumerable<Dictionary<string, object>> rows) => ((IEnumerable<IDictionary<string, object>>)rows).AsDataTable(); 的代码:

validateData()

答案 2 :(得分:1)

你可以这样做:

var selectColumns = dtRecord.Columns.Cast<DataColumn>().Take(10);

var dtResult = new DataTable();

foreach (var column in selectColumns)
    dtResult.Columns.Add(column.ColumnName);

foreach (DataRow row in dtRecord.Rows)
    dtResult.Rows.Add(row.ItemArray.Take(10).ToArray());

也许您应该创建一个相同类型且具有相同表达式的列:

dtResult.Columns.Add(column.ColumnName, column.DataType, column.Expression);

答案 3 :(得分:0)

获得10列:

 var tbl = new System.Data.DataTable();
var cols = tbl.Columns.Cast<System.Data.DataColumn>().Take(10);
// if you wish to get first 10 columns...

如果您想获取数据,则必须遍历列以获取数据。

var data = cols.SelectMany(x => tbl.Rows.Cast().Take(10).Select(y => y[x]));

当然,如果你想使用强类型对象或一维数组列表,这会把所有数据转储成一个ienumerable,相信它很简单,例如:

var data2 = cols.Select(x => tbl.Rows.Cast().Take(10).Select(y => y[x]).ToArray());