【问题标题】:Joining two data-table and save result in data-table连接两个数据表并将结果保存在数据表中
【发布时间】:2019-08-15 10:28:36
【问题描述】:

我有 2 个数据集,我想连接两个数据集并将结果保存在数据表中。

我可以加入表格,但是在将结果保存在数据表中时会引发错误 '无法转换类型为 d__38 的对象 4[System.Data.DataRow,System.Data.DataRow,System.String,f__AnonymousType0 7[System.String,System.String,System.Int32,System.Int32, System.String,System.String,System.String]]' 输入'System.Data.DataTable'

我的代码:

private DataSet joindatasets(DataSet ds1, DataSet dsHeader)
        {
            DataTable dt; 
            DataSet ds = new DataSet(); 
            DataTable dt1=new DataTable();

        dt1.Columns.Add("PracticeCode", typeof(string));
        dt1.Columns.Add("PracticeName", typeof(string));
        dt1.Columns.Add("High", typeof(int));
        dt1.Columns.Add("Medium", typeof(int));
        dt1.Columns.Add("username", typeof(string));
        dt1.Columns.Add("MIAlertHeader", typeof(string));
        dt1.Columns.Add("MIAlertFooter", typeof(string));

        if (dsHeader.Tables.Count > 0)
        {
            for (int i = 0; i <= dsHeader.Tables.Count - 1; i++)
            {
                dt = dsHeader.Tables[i];

                var query = from table1 in ds1.Tables[0].AsEnumerable()
                             join table2 in dt.AsEnumerable()
                             on (string)table1["PracticeCode"] equals (string)table2["PracticeCode"]


                            select new
                            {
                                PracticeCode = (string)table1["PracticeCode"],
                                PracticeName = (string)table1["PracticeName"],
                                High = (int)table1["High"],
                                Medium = (int)table1["Medium"],
                                username = (string)table2["username"],
                                MIAlertHeader = (string)table2["MIAlertHeader"],
                                MIAlertFooter = (string)table2["MIAlertFooter"]
                            };
                dt1 = (DataTable)query;

            }
        }

        return ds;
    }

请帮忙

【问题讨论】:

标签: c# asp.net


【解决方案1】:

当您尝试将IEnumerable&lt;object&gt; 转换为DataRow 时,经常会发生此类错误。要解决此问题,您必须使用 DataTable.LoadDataRow method + CopyToDataTable method

            dt1 = (from table1 in ds1.Tables[0].AsEnumerable()
                         join table2 in dt.AsEnumerable()
                         on (string)table1["PracticeCode"] equals (string)table2["PracticeCode"]
                        select dt1.LoadDataRow(new object[]
                        {
                            (string)table1["PracticeCode"],
                            (string)table1["PracticeName"],
                            (int)table1["High"],
                            (int)table1["Medium"],
                            (string)table2["username"],
                            (string)table2["MIAlertHeader"],
                            (string)table2["MIAlertFooter"]
                        }, false)).CopyToDataTable();

更多详情,您可以在这里找到:Creating a DataTable From a Query (LINQ to DataSet)

【讨论】:

    【解决方案2】:

    创建以下方法并传递您的 LINQ 查询返回的任何类型的对象。

    public static DataTable CreateDataTableFromAnyCollection<T>(IEnumerable<T> list)
        {
            Type type = typeof(T);
            var properties = type.GetProperties();
    
            DataTable dataTable = new DataTable();
            foreach (PropertyInfo info in properties)
            {
                dataTable.Columns.Add(new DataColumn(info.Name, Nullable.GetUnderlyingType(info.PropertyType) ?? info.PropertyType));
            }
    
            foreach (T entity in list)
            {
                object[] values = new object[properties.Length];
                for (int i = 0; i < properties.Length; i++)
                {
                    values[i] = properties[i].GetValue(entity,null);
                }
    
                dataTable.Rows.Add(values);
            }
    
            return dataTable;
        }
    

    然后像这样传递你的 LINQ 结果

    DataTable dt = CreateDataTableFromAnyCollection(list);
    

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 2013-07-11
      • 1970-01-01
      • 2019-02-19
      相关资源
      最近更新 更多