动态LINQ groupby并从ADO datatable和return datatable中选择列
我有一个ADO数据表,如下所示动态LINQ groupby并从ADO datatable和return datatable中选择列,linq,dynamic,Linq,Dynamic,我有一个ADO数据表,如下所示 tname cname rgname schools mtext tn1 cn1 rg1 1 mxt1 tn1 cn1 rg1 2 mxt1 tn1 cn1 rg1 3 mxt1 tn2 cn2 rg2 5 mxt2 tn2 cn2 rg2 8 mxt2 tn2 cn2
tname cname rgname schools mtext
tn1 cn1 rg1 1 mxt1
tn1 cn1 rg1 2 mxt1
tn1 cn1 rg1 3 mxt1
tn2 cn2 rg2 5 mxt2
tn2 cn2 rg2 8 mxt2
tn2 cn2 rg2 3 mxt2
tn3 cn1 rg1 7 mxt1
tn3 cn1 rg1 4 mxt1
我想通过以逗号分隔的方式分组和连接学校,从上面的表生成一个表。结果应该是这样的
tname cname rgname schools mtext
tn1 cn1 rg1 1,2,3 mxt1
tn2 cn2 rg2 5,8,3 mxt2
tn3 cn1 rg1 7,4 mxt1
我只知道在运行时按列分组。我还希望将结果作为类似的数据表,因为有更多的列到15。S是否可以使用动态分组方式并选择lambda表达式
我已经实现了动态分组的逻辑,但是动态选择让我很困扰
var result = from o in DT.AsEnumerable()
group o by new
{
cname = groupByCname? o.Field<string>("cname") : null,
tname = groupByTname? o.Field<string>("tname") : null,
rgname = groupByRGname? o.Field<string>("rgname") : null,
mtext = groupByMtext? o.Field<string>("mtext") : null,
} into g
select new
{
//Here i want to select all columns from DT and have schools as
// comma separated
schools = String.Join(",",g.Select(x=>x.Field<string> ("Schools")).ToArray())
};
感谢您的帮助我已对您的代码进行了一些修改。这可能不是最好的方法,但它确实能满足您的需要
var result = from row in
(from t in
(from o in dt.AsEnumerable()
join u in dt.AsEnumerable()
on o.Field<string>("tname") equals u.Field<string>("tname")
select new
{
o,
u = String.Join(",", u.Field<string>("schools"))
})
group t by new
{
tname = t.o.Field<string>("tname"),
cname = t.o.Field<string>("cname"),
rgname = t.o.Field<string>("rgname"),
mtext = t.o.Field<string>("mtext")
} into gcs
select new
{
rows = gcs.Select(x => x.o).First(),
schools = gcs.Select(x => x.u).Take(gcs.Key.tname.Count())
})
select row;
DataTable resultTable = new DataTable();
resultTable = dt.Clone();
foreach (var item in result)
{
DataRow row = resultTable.NewRow();
for (int i = 0; i < item.rows.ItemArray.Length; i++)
{
if (row.Table.Columns[i].ToString() == "schools")
{
row[i] = string.Join(", ", item.schools.ToList());
}
else
{
row[i] = item.rows.ItemArray[i];
}
}
resultTable.Rows.Add(row);
}
谢谢你的回复。“按列分组”也是动态的,我处理“按列分组”的方式是否错误?我的意思是,有时group by列将仅为tname,rgname。这很接近:事实上,您自己的代码对我来说也很好。上面所说的是一个参数,但我有可能使用多个group by。所以可能是上面的链接不起作用。