根据列名列表将一个Datatable拆分为多个Datatable

3
我有一个数据表格,看起来像下面这样。
ID        Country      Supplier
515       DE           A
515       CH           A
515       FR           A
516       DE           B
516       FR           B
517       DE           C
517       IT           C

我有一个包含动态列名的 List<string>,例如如果该列表只包含一个列:
Supplier

我想从这个表格中生成一个 List<DataTable> 或者一个 DataSet,根据列表中的列名将表格分离。在这种情况下,我只按 Supplier 列进行分离,结果将会是三个如下所示的 DataTables。
    ----------table 1--------
    515       DE           A
    515       CH           A
    515       FR           A
    ----------table 2--------
    516       DE           B
    516       FR           B
    ----------table 3--------  
    517       DE           C
    517       IT           C

但是,如果列名的List<string>包含了以下内容:
Supplier
Country

结果将会是7个数据表,每个数据表都包含一行。
    ----------table 1--------
    515       DE           A
    ----------table 2--------
    515       CH           A
    ----------table 3--------
    515       FR           A
    ----------table 4--------
    516       DE           B
    ----------table 5--------
    516       FR           B
    ----------table 6--------  
    517       DE           C
    ----------table 7--------
    517       IT           C

另一个例子是,如果列名的 List<string> 只包含 Country 列,则结果将为:
----------table 1--------
515       DE           A
516       DE           B
517       DE           C
----------table 2--------
515       CH           A
----------table 3--------
515       FR           A
516       FR           B
----------table 4--------
517       IT           C

如何使用LINQ实现这个功能,查询将基于包含在列表中的列名动态生成,您能指导我吗?
我已经使用了DataTable.Select和Select distinct以及嵌套循环的动态字符串来完成它,但它看起来很复杂,我想知道是否有更有效的方法来实现这个功能。
1个回答

1
你可能想要使用System.Linq.Dynamic
var dt = new DataTable();
var res = new List<DataTable>();

dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Country", typeof(string));
dt.Columns.Add("Supplier", typeof(string));
dt.Rows.Add(515, "DE", "A");
dt.Rows.Add(515, "CH", "A");  
dt.Rows.Add(515, "FR", "A");
dt.Rows.Add(516, "DE", "B");
dt.Rows.Add(516, "FR", "B");
dt.Rows.Add(517, "DE", "C");
dt.Rows.Add(517, "IT", "C");

var fields = new List<string>() { "Supplier", "Country"};
var qfields = string.Join(", ", fields.Select(x => "it[\"" + x + "\"] as " + x));
// qfields = "it[\"Supplier\"] as Supplier, it[\"Country\"] as Country"

var q = dt
    .AsEnumerable()
    .AsQueryable()
    .GroupBy("new(" + qfields + ")", "it")
    .Select("new (it as Data)");
foreach (dynamic d in q)
{
    var dtemp = dt.Clone();

    foreach (var row in d.Data)
        dtemp.Rows.Add(row.ItemArray);

    res.Add(dtemp);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接