【问题标题】:Splitting the datatable into multiple datatables将数据表拆分为多个数据表
【发布时间】:2013-02-27 13:24:01
【问题描述】:

这些是我的数据表dtAllData的内容。

 column_1  column_2  column_3    
 --------  --------  --------  
 sec_1       Test1        2
 sec_1       Result1      5
 sec_1       Unit1        2 
 sec_2       Test2        2           
 sec_2       Result2      2
 sec_2       Unit2        5
 sec_3       Test3        2 
 sec_3       Result3      2     
 sec_3       Unit3        2     

我需要根据column_1列的内容将其拆分为多个数据表。

所以在这种情况下,我应该得到 3 个表(一个包含所有行都带有 sec_1,其他带有 sec_2 和另一个带有 sec_3)。

我试过了:

var dtArray = dtAllData.AsEnumerable() 
                            .GroupBy(row => new
                            {
                                column_1 = (string)row["column_1"]
                            });
DataTable[] array = new DataTable[dtArray.Count()];

如何从dtArray 获取array 中的表格?

【问题讨论】:

  • 拆分的目的是什么?在 ASA/ASE 数据库(Sybase 产品)中,可以基于某些列进行复制。我不是 SQLServer 专家,但也许 SqlServer 有类似的功能?
  • 你写我需要把它分成多个数据表 我应该得到3个表你想在多个数据库或表中拆分?为什么要分组?您只需按 where clausole 过滤表格

标签: c# linq


【解决方案1】:

使用CopyToDataTable()方法将数据放入一个新的DataTable中。

var Result =  from x in dtAllData.AsEnumerable()
              where x.Field<string>("column_1") == "sec_1"
              select x;
DataTable t1 = Result.CopyToDataTable();

另一种方法是使用LoadDataRow() 方法。 Here is an example

【讨论】:

  • 你能看看我的question 之一吗?
  • @kaf 我在有 500 万行的数据表中使用了这个解决方案,但是我的内存不足异常,我能帮我避免这个异常吗,我需要一个解决方案来用内存优化的方式来管理它跨度>
【解决方案2】:

如果您知道 column_1 的确切名称,您可以使用.Select.Select("column_1 = sec_1")etc。或使用DataView

【讨论】:

    【解决方案3】:

    修改Kaf的解决方案,实现了我想要的:

    var uniqueList = dtAllData.AsEnumerable().Select(x=> x.Field<string>("column_1")).Distinct();
    List<string> myList = new List<string>();
    myList =uniqueList.ToList();
    
    DataTable[] array = new DataTable[myList.Count()];
    int index = 0;
    foreach (string item in myList)
    {
        var Result =  from x in dtAllData.AsEnumerable()
                      where x.Field<string>("column_1") == item
                      select x;
        DataTable table = Result.CopyToDataTable();
        array[index] = table;
        index++;
    }
    

    所以array包含3个数据表,column_1的值不同

    【讨论】:

    • 你能看看我的question 之一吗?
    【解决方案4】:
    Function splitDataTable(ByVal tbl As DataTable) As DataTable()
        Dim tableCount = Math.Ceiling(tbl.Rows.Count / NewCountRows)
    
        Dim Divisor = tbl.Rows.Count / tableCount
        Dim tables = tbl.AsEnumerable().Select(Function(r, i) New With {.row = r, .index = i}).GroupBy(Function(x) Math.Floor(x.index / Divisor)).Select(Function(g) g.Select(Function(x) x.row).CopyToDataTable())
        Return tables.ToArray
    End Function
    

    【讨论】:

      猜你喜欢
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 2022-01-07
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多