我有一个看起来像以下
的数据表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
列分隔,结果将是是3个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的日期字符串和选择不同的和嵌套的循环,但它看起来很复杂,我想知道是否有更有效的方法来实现这个
答案 0 :(得分: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);
}