Создать DataTable с помощью LINQ для выбора нескольких столбцов - PullRequest
1 голос
/ 06 июня 2019

Мне нужно создать DataTable из другого имеющегося у меня DataTable, но только с несколькими столбцами (точно такими же строками).

Есть ли простой способ сделать это с помощью LINQ?

Iпробовал:

DataTable dataCopy = dt.AsEnumerable()
                       .Select(r => new { A = r.Field<string>("Column A"),
                                          B = r.Field<string>("Column B") });

Но у него нет метода «CopyToDataTable».

Я ищу лучший способ сделать это, потому что мой «исходный» DataTable огромен!

Ответы [ 3 ]

1 голос
/ 06 июня 2019

Вы можете просто скопировать dataTable, используя dataTable.Copy(), и удалить ненужные столбцы из скопированного объекта.

var dt1 = dt.Copy();
dt.Columns.Remove("<columnsToRemove>")
0 голосов
/ 06 июня 2019
    public static DataTable GetDataTablePart(this DataTable dt, params string[] ColumnNames)
    {
        var dtPart = new DataTable("TablePart");
        var Names = new List<DataColumn>();
        foreach (DataColumn Column in dt.Columns)
        {
            if(ColumnNames.Contains(Column.ColumnName))
            {
                Names.Add(Column);
            }
        }
        dtPart.Columns.AddRange(Names.ToArray());
        foreach(DataRow row in dt.Rows)
        {
            var NewRow = new object[Names.Count()];
            var i = 0;
            foreach (var Name in Names)
            {
                NewRow[i] = row[Name];
                i = i + 1;
            }
            dtPart.LoadDataRow(NewRow, false);
        }
        return dtPart;
    }

версия linq ....

    public static DataTable GetDataTablePart(this DataTable dt, params string[] ColumnNames)
    {
        var RowCount = 0;
        var dtPart = new DataTable("TablePart");
        dtPart.Columns.AddRange((from column in dt.Columns.Cast<DataColumn>()
                     where ColumnNames.Contains(column.ColumnName)
                     select column).ToArray());
        return (from row in dt.AsEnumerable()
                  let rowCount = RowCount = dt.Rows.Count
                  let RowValues = (from column in dtPart.Columns.Cast<DataColumn>()
                                   select row[column]).ToArray()
                  let decCount = RowCount = RowCount - 1
                  where dtPart.LoadDataRow(RowValues,LoadOption.OverwriteChanges) != default && decCount > 0
                  select dtPart).FirstOrDefault();
    }
0 голосов
/ 06 июня 2019
    Stopwatch time = new Stopwatch();

                time.Start();
    //COMPARE YOUR CODE (.Copy, Clone or Develop yourself)
                DataTable dtTarget = dtSource.CopyDataTable(new List<string>() { "A", "B" });

                foreach (DataColumn column in dtTarget.Columns)
                {
                    Console.WriteLine("ColumnName : {0}", column.ColumnName);

                    foreach (DataRow row in dtTarget.Rows)
                    {
                        Console.WriteLine("Rows : {0}", row[column.ColumnName]);
                    }
                }

                time.Stop();

                Console.WriteLine("{0}", time.Elapsed);



public static class DataTableHelper
    {
        public static DataTable CopyDataTable(
           this DataTable dtSource,
            List<string> columnsName)
        {

            DataTable dtTarget = new DataTable();
            if (dtSource.Columns.Count > 0)
            {

                foreach (DataColumn columnSource in dtSource.Columns)
                {
                    var columnTargetMapped = columnsName.FirstOrDefault(c => c == columnSource.ColumnName);

                    if(columnTargetMapped == null)
                    {
                        continue;
                    }

                    dtTarget.Columns.Add(columnTargetMapped);

                    foreach (DataRow drSource in dtSource.Rows)
                    {
                        var valueColumn = drSource[columnSource];

                        DataRow drTarget = dtTarget.NewRow();

                        drTarget[columnTargetMapped] = valueColumn;

                        dtTarget.Rows.Add(drTarget);
                    }
                }
            }

            return dtTarget;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...