从DataTable中选择一行并选择Create New Row以添加到DefaultView

时间:2016-02-17 14:02:59

标签: c# wpf linq

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

 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。帮助

1 个答案:

答案 0 :(得分:2)

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

您似乎尝试使用构造函数和anonymous types进行混合,或者特别是您尝试在DataRow上使用object initializer

在这段代码中,有两件事情无法解决:

  1. 数据行只有following constructorDataRow(DataRowBuilder builder),需要DataRowBuilder。通常,您可以通过调用DataTable.NewRow()

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

  4. 我建议您使用this question中的一种方法,在select子句中创建一个匿名类型,然后通过使用refelection或使用其他方法将生成的IEnumerable转换为DataTable。

    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.
    // ...