在下面的Linq语句中,例如,我使用了GroupBY子句。
.GroupBy(i => new{ID = i.Field<decimal>("ID"),COL1 = i.Field<string>("COL1"),COL2 = i.Field<string>("COL2")})
帮助我使GroupBy子句动态化,因为将从数据表中检索列名COL1,COL2,并且列名可能会更改/增加/减少,但会出现列ID。 因此建议我如何在linq语句中使groupby子句动态化。
Linq示例
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()) ;
}
谢谢。
答案 0 :(得分:0)
我可以建议2种使您的GroupBy
动态的方法:
string
变量:var column1 = "COL1"; // user input
var column2 = "COL2"; // user input
// the querying ...
.GroupBy(i => new
{
ID = i.Field<decimal>("ID")
, COL1 = i.Field<string>(column1)
, COL2 = i.Field<string>(column2)
}
)
这使其变得更加复杂!这是here的示例。
我更喜欢第一种方法,因为它很容易并且不需要额外的精力和库。