复制到新数据表时,linq会排除某些列

时间:2018-05-09 19:01:41

标签: c# linq

我正在尝试使用OpenXML和LoadfromDataTable创建Excel工作表。如果有更好的话,我没有和那个功能结婚。我试图排除数据表列,以便它们不会显示在Excel工作表中。例如,我有一个数据表,其中包含列“ID”,“名称”和“地址”。

   ID Name  Address
   1  Name1 So SO Street
   2  Name2 Do Do Street

我要做的是创建一个只有列名称和地址以及排除ID的新数据表。

我有一个linq查询,它获取了我希望在新数据表中看到的列列表,如下所示:

var columns = dt1.Columns.Cast<DataColumn>().Where(c => c.ColumnName != "ID").ToList();

我正在尝试使用该列表来创建一个新的数据表,只是列表中的那些列。

2 个答案:

答案 0 :(得分:0)

您可以在数据表中使用选择几列。选择

var result = from a in new DataContext().DataColumn
                 where a.ColumnName != "ID"
                 select new {a.NotForExcel, a.ExcelColumn1, a.ExcelColumn2 };

var ExcelList = result.AsEnumerable()
                              .Select(o => new DataColumn {
                                               Column1 = o.ExcelColumn1, 
                                               Column2 = o.ExcelColumn2 
                              }).ToList();

答案 1 :(得分:0)

通过创建已定义DataTable的新DataView,有一种简单的方法可以做到这一点。要显示示例,请创建table1

DataTable table1 = new DataTable();
table1.Columns.Add("ID");
table1.Columns.Add("Value1");
table1.Columns.Add("Value2");

table1.Rows.Add(new object[] { 0, "zero", "nothing" });
table1.Rows.Add(new object[] { 1, "one", "single" });

现在,您需要通过过滤table2列来指定新table1中要包含的列。在我们的示例中,我们需要除&#34; ID&#34;:

之外的所有列
string[] columns = table1.Columns.OfType<DataColumn>()
    .Where(c => c.ColumnName != "ID")
    .Select(c => c.ColumnName).ToArray();

使用此列,您可以创建新的table2

DataTable table2 = new DataView(table1).ToTable(false, columns);

结果table2看起来像

Value1 | Value2
-------|--------
zero   | nothing
one    | single