至少一个对象必须实现 IComparable。 AsEnumerable() 和 Sum()

At least one object must implement IComparable. AsEnumerable() and Sum()

我尝试在 tbl.AsEnumerable() 上对多个列进行分组, 我想将 cus、salesman、ppj 和 curr 分组,而 amt_base 应该是总和。

一切都很好, 但是当我在 amt 的总和上使用 grp.Sum(r => r.Field<decimal>("amt_base")) 时,它显示 At least one object must implement IComparable. foreach ().

上的错误
var results = from rows in tbl.AsEnumerable()
                              group rows by new
                              {
                                  cus = rows["cus"],
                                  salesman = rows["salesman"],
                                  ppj = rows["ppj"],
                                  curr = rows["curr"],

                              }into grp
                              orderby grp.Key
                              select new
                              {
                                  cus = grp.Key.cus,
                                  nm = grp.First()["nm"],
                                  salesman = grp.Key.salesman,
                                  ppj = grp.Key.ppj,
                                  curr = grp.Key.curr,
                                  amt_base = grp.Sum(r => r.Field<decimal>("amt_base")),
                              };

                DataTable tbl2 = new DataTable();
                tbl2.Columns.Add("cus");
                tbl2.Columns.Add("nm");
                tbl2.Columns.Add("salesman");
                tbl2.Columns.Add("ppj");
                tbl2.Columns.Add("curr");
                tbl2.Columns.Add("amt_base");

                decimal  tamt_base = 0;

                foreach (var item in results)
                {
                    DataRow dr2 = tbl2.NewRow();
                    dr2["cus"] = item.cus;
                    dr2["nm"] = item.nm;
                    dr2["salesman"] = item.salesman;
                    dr2["ppj"] = item.ppj;
                    dr2["curr"] = item.curr;
                    dr2["amt_base"] = Math.Round(item.amt_base, 2, MidpointRounding.AwayFromZero);
                    tbl2.Rows.Add(dr2);
                    tamt_base += item.amt_base;
                }

无法确定如何根据由 4 个随机列组成的匿名类型对行进行排序。它需要能够将每个实例与之前的实例进行比较,这通常是通过让您的 class 实现 IComparable 接口来完成的……但是您不能使用匿名类型。

删除这个:

orderby grp.Key

如果您确实需要某种排序,请尝试使用单独的字段:

orderby grp.Key.cus