我有一个数据表,我需要使用n列。例如:从下面的数据表我需要单独使用数据的前10列并将其放在另一个数据表中。
代码:
DataTable dtRecord = DAL.GetRecords();
我尝试了这个,并没有采取所需的列。
var selectColumns = dtRecord .Columns.Cast<System.Data.DataColumn>().Take(10);
答案 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
和匿名对象,以及动态转换为匿名对象的扩展。以下是DataTable
到public 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());