按ID和OrderID将Dataset数据表拆分为多个数据表

本文关键字:数据表 拆分 Dataset ID OrderID | 更新日期: 2023-09-27 18:14:19

我收到了一个包含所有重复ItemCode和OrderID的数据表的数据集。

我可以在DS下面转换吗?表[0]到多个数据表,这些数据表由不同的ItemCode和OrderID使用linq.

<table>
  <tr><th>ItemID</th><th>OrderID</th><th>ItemName</th></tr>
  <tr><td>1</td><td>12</td><td>Item1</td></tr>
  <tr><td>1</td><td>12</td><td>Item1</td></tr>
  <tr><td>1</td><td>13</td><td>Item1</td></tr>
  <tr><td>1</td><td>13</td><td>Item1</td></tr>
  <tr><td>2</td><td>12</td><td>Item1</td></tr>
  <tr><td>2</td><td>13</td><td>Item1</td></tr>
  <tr><td>2</td><td>13</td><td>Item1</td></tr>
  <tr><td>3</td><td>13</td><td>Item1</td></tr>
  <tr><td>3</td><td>13</td><td>Item1</td></tr>
  <tr><td>3</td><td>13</td><td>Item2</td></tr>
  <tr><td>3</td><td>13</td><td>Item1</td></tr>
</table>

按ID和OrderID将Dataset数据表拆分为多个数据表

下面是一个例子:

using System;
using System.Data;
using System.Linq;
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var DS = new DataSet();
            DS.Tables.Add();
            DS.Tables[0].Columns.Add("ItemID", typeof(int));
            DS.Tables[0].Columns.Add("OrderID", typeof(int));
            DS.Tables[0].Columns.Add("ItemName");
            DS.Tables[0].Rows.Add(1, 12, "Item1");
            DS.Tables[0].Rows.Add(1, 12, "Item1");
            DS.Tables[0].Rows.Add(1, 13, "Item1");
            DS.Tables[0].Rows.Add(1, 13, "Item1");
            DS.Tables[0].Rows.Add(2, 12, "Item1");
            DS.Tables[0].Rows.Add(2, 13, "Item1");
            DS.Tables[0].Rows.Add(2, 13, "Item1");
            DS.Tables[0].Rows.Add(3, 13, "Item1");
            DS.Tables[0].Rows.Add(3, 13, "Item1");
            DS.Tables[0].Rows.Add(3, 13, "Item2");
            DS.Tables[0].Rows.Add(3, 13, "Item1");
            var results = DS.Tables[0].AsEnumerable()
                .GroupBy(x => new
                {
                    ItemID = x.Field<int>(0),
                    OrderID = x.Field<int>(1)
                })
                .Select(x =>
                {
                    var t = new DataTable();
                    t.Columns.Add("ItemName");
                    x.ToList().ForEach(y => t.Rows.Add(y.Field<string>(2)));
                    return new { x.Key, Table = t };
                });
            foreach (var i in results)
            {
                Console.WriteLine("'n[ ItemID: " + i.Key.ItemID + ", OrderID: " + i.Key.OrderID + " ]");
                foreach (var row in i.Table.AsEnumerable())
                    Console.WriteLine("  " + row[0]);
            }
            Console.WriteLine("'nPress any key...");
            Console.ReadKey();
        }
    }
}

输入看起来像html,而不是xml。有些html可以用xml处理,像下面的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:'temp'test.xml";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            XDocument table = XDocument.Load(FILENAME);
            List<XElement> rows = table.Descendants("tr").ToList();
            foreach (XElement col in rows[0].Elements("th").ToArray())
            {
                dt.Columns.Add((string)col, typeof(string));
            }
            for (int i = 1; i < rows.Count; i++)
            {
                dt.Rows.Add(rows[i].Elements("td").Select(x => (string)x).ToArray());
            }
            DataTable dt1 = dt.AsEnumerable().Where(x => x.Field<string>("ItemName") == "Item1").CopyToDataTable();
            DataTable dt2 = dt.AsEnumerable().Where(x => x.Field<string>("ItemName") == "Item2").CopyToDataTable();
        }
    }
}