从数据表中选择一行,然后创建新行以添加到 DefaultView

本文关键字:新行 创建 然后 添加 DefaultView 一行 选择 数据表 | 更新日期: 2023-09-27 18:35:06

我正在尝试从数据表中选择几行并检查某些条件。然后我想创建一个新行,将两列的数据类型从表示通用时间的字符串转换为表示本地时间的字符串,将字符串转换为整数。这是我的代码:

 dt = (from row in MV.Data.AsEnumerable()
       where !(row["conditionCodes"].ToString().Contains("%OC%"))
       orderby Convert.ToDouble(row["size"]) descending
       select new DataRow 
       {
         size = Convert.ToInt64(row["size"]),
         time = Convert.ToDateTime(row["time"]).ToLocalTime 
       }).CopyToDataTable();

这段代码不起作用,也不喜欢我试图创建一个新的 DataRow。帮助?

从数据表中选择一行,然后创建新行以添加到 DefaultView

您希望创建新的 DataRow 的方式不起作用,select new DataRow { size = ..., time = ...}

您似乎尝试混合使用构造函数和匿名类型,或者您正在尝试在 DataRow 上使用对象初始值设定项。

在此代码中,有两件事不起作用:

  1. 数据行只有以下构造函数 DataRow(DataRowBuilder builder) ,它需要一个 DataRowBuilder。通常,通过调用 DataTable.NewRow() 来创建数据行

  2. 即使您可以在尝试时创建 DataRow,也不会知道成员sizetime

我建议您使用此问题中的一种方法,方法是在 select 子句中创建匿名类型,然后将生成的 IEnumerable 转换为 DataTable,方法是使用 refelection 或使用其他方法。

var result = (from row in MV.Data.AsEnumerable()
              where !(row["conditionCodes"].ToString().Contains("%OC%"))
              orderby Convert.ToDouble(row["size"]) descending
              select new
              {
                size = Convert.ToInt64(row["size"]),
                time = Convert.ToDateTime(row["time"]).ToLocalTime 
              }
// Convert result to datatable using reflection, etc.
// ...