至少有一个对象必须实现iccomparable.AsEnumerable()和Sum()
本文关键字:AsEnumerable Sum iccomparable 实现 一个对象 | 更新日期: 2023-09-27 17:50:54
我尝试在tbl.AsEnumerable()
上分组多列,我想将cus, salesman, ppj和curr分组,而amt_base应该是总和。
一切很好,但是当我使用grp.Sum(r => r.Field<decimal>("amt_base"))
的总和显示至少一个对象必须实现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个随机列组成的匿名类型确定如何排序行。它需要能够将每个实例与前一个进行比较,这通常是通过让您的类实现IComparable
接口来完成的……但是你不能使用匿名类型。
删除:
orderby grp.Key
如果你真的需要某种排序,尝试使用单独的字段:
orderby grp.Key.cus