【问题标题】:Select a row from a DataTable and Create New Row to Add to DefaultView从 DataTable 中选择一行并创建新行以添加到 DefaultView
【发布时间】:2016-02-17 14:02:59
【问题描述】:

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

 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。帮忙?

【问题讨论】:

    标签: c# wpf linq


    【解决方案1】:

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

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

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

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

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

    我建议您使用this question 中的一种方法,方法是在您的 select 子句中创建一个匿名类型,然后通过使用反射或其他方法将生成的 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.
    // ...
    

    【讨论】:

    • 谢谢!这非常清楚,并消除了我的一些困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多