Linq Dynamic GroupBy子句

时间:2019-07-06 01:16:33

标签: c# linq

在下面的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()) ;

                        }

谢谢。

1 个答案:

答案 0 :(得分:0)

我可以建议2种使您的GroupBy动态的方法:

  1. 在查询中使用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)
            }
         )
  1. 使用System.Dynamic.Linq软件包进行动态查询

这使其变得更加复杂!这是here的示例。


我更喜欢第一种方法,因为它很容易并且不需要额外的精力和库。