0

我有一个数据表结果,我使用 AsEnumerable 扩展将其转换为 Enumerable。

var dataTableToEnumerable = dataTable.AsEnumerable();

现在我使用 Linq 动态扩展对其进行了 groupBy,它工作正常,但我无法对聚合结果进行处理Select()Sum()等等Min()

但是存在诸如 Count(),First(),FirstOrDefault() 之类的方法。

dataTableToEnumerable.AsQueryable().Where("(it[\"yoko\"] != null&&it[\"price\"] != null)")
.GroupBy("new(it[\"proposalid\"] as proposalid,it[\"yoko\"] as yoko)", "it").Select("it.Sum(\"price\")").

同样参考这个问题,我将查询更改为:-

(dataTableToEnumerable.AsQueryable().Where("(it[\"yoko\"] != null&&it[\"price\"] != null)")
.GroupBy("new(it[\"proposalid\"] as proposalid,it[\"yoko\"] as yoko)", "it") as IEnumerable<IGrouping<DynamicClass,DataRow>>).Select("it.Sum(\"price\")").

但现在它的表现No Method Select exist on IEnumerable<IGrouping<DynamicClass,DataRow>>

它给出了错误No applicable method 'Select' exists in type 'DataRow',有人可以帮忙吗?

#更新1

我已经尝试过第一个答案。它工作正常,但是在 groupby 之后有多个字段选择,我该如何更改它?这是我的查询:- dataTableToEnumerable.AsQueryable().Where("(it[\"yoko\"] != null && it[\"price\"] != null)") .GroupBy("new(it[\"proposalid\"] as proposalid,it[\"yoko\"] as yoko)", "it") .Select("new(it.Select(it[\"price\"] as price,it[\"cost\"] as cost)")

结果集是正确的,但是,
.AsEnumerable() .Select(pg => (((IEnumerable<object>)pg).Sum(p => (double)p)));

这导致错误

无法将“<>f__AnonymousType15`2[System.Object,System.Object]”类型的对象转换为“System.IConvertible”类型。

4

1 回答 1

1

您可以使用字符串索引器方法提取price列,然后使用 将动态 LINQ 转换为 LINQ 到对象,然后您可以将其转换为适当的类型:DataRowobjectAsEnumerableIEnumerable<object>

var ans = dataTableToEnumerable.AsQueryable().Where("(it[\"yoko\"] != null && it[\"price\"] != null)")
            .GroupBy("new(it[\"proposalid\"] as proposalid,it[\"yoko\"] as yoko)", "it")
            .Select("it.Select(it[\"price\"])")
            .AsEnumerable()
            .Select(pg => (((IEnumerable<object>)pg).Sum(p => (double)p)));

如果您不需要 中的任何其他字段,则GroupBy可以对price列进行分组:

var ans = dataTableToEnumerable.AsQueryable().Where("(it[\"yoko\"] != null && it[\"price\"] != null)")
            .GroupBy("new(it[\"proposalid\"] as proposalid,it[\"yoko\"] as yoko)", "it[\"price\"]")
            .AsEnumerable()
            .Select(pg => (((IEnumerable<object>)pg).Sum(p => (double)p)));

要处理多个列,您必须手动调用扩展方法Sum,因为扩展方法不适用于dynamic对象,并且您必须手动将 lambda 转换为,Func因为编译器无法判断您是否需要表达式树或表达式中的dynamic函数:

var ans = dataTableToEnumerable.AsQueryable().Where("(it[\"yoko\"] != null && it[\"price\"] != null)")
            .GroupBy("new(it[\"proposalid\"] as proposalid,it[\"yoko\"] as yoko)")
            .Select("it.Select(new(it[\"price\"] as price, it[\"cost\"] as cost))")
            //.AsEnumerable()
            //.Select(pg => (((IEnumerable<object>)pg).Sum(p => (double)p)))
            .AsEnumerable()
            .Select(x => new {
                sumPrice = Enumerable.Sum(x, (Func<dynamic, double>)(y => y.price)),
                sumCost = Enumerable.Sum(x, (Func<dynamic, double>)(y => y.cost))
            })
            .ToList();
于 2020-06-25T23:05:45.583 回答