In the bellow Linq Statement, i have used GroupBY Clause for e.g.
.GroupBy(i => new{ID = i.Field<decimal>("ID"),COL1 = i.Field<string>("COL1"),COL2 = i.Field<string>("COL2")})
Help me in making GroupBy clause dynamic, as column names COL1, COL2 will be retrieved from datatable and column names might change/ increase/ decrease, but column ID would be present. Hence suggest me how we can make groupby clause dynamic in linq statement.
Linq Example
DataTable dt2 = new DataTable("Order");
DataColumn dc2 = dt2.Columns.Add("ID", typeof(decimal));
dt2.Columns.Add("AMT", typeof(decimal));
dt2.Columns.Add("PERCENTAGE", typeof(decimal));
dt2.Columns.Add("COL1", typeof(String));
dt2.Columns.Add("COL2", typeof(String));
dt2.Rows.Add(6, 200,100,"xxx","yyy");
dt2.Rows.Add(8, 400, 100,"qqq","fff");
dt2.Rows.Add(1, 300, 100,"eee","aaa");
dt2.Rows.Add(1, 200, 100,"eee","aaa");
dt2.Rows.Add(10,400,100,"sss","vvv");
var duplicates = dt2.AsEnumerable()
.GroupBy(i => new{ID = i.Field<decimal>("ID"),COL1 = i.Field<string>("COL1"),COL2 = i.Field<string>("COL2")})
.Where(g => g.Count() > 1)
.Select(g =>
{
var row = dt2.NewRow();
row["ID"] = g.Key.ID;
row["COL1"] = g.Key.COL1;
row["COL2"] = g.Key.COL2;
row["AMT"] = g.Sum(r => r.Field<decimal>("AMT"));
row["PERCENTAGE"] = g.Sum(r => r.Field<decimal>("PERCENTAGE"));
return row;
}).CopyToDataTable();
foreach(DataRow row in duplicates.Rows)
{
Console.WriteLine(row["ID"].ToString() + " " + row["COL1"].ToString() + " " + row["COL2"].ToString() + " " + row["AMT"].ToString() + " " + row["PERCENTAGE"].ToString()) ;
}
Thanks.