类型 'DataRow' 中不存在适用的方法 'Select'

No applicable method 'Select' exists in type 'DataRow'

我有一个数据 table 结果,我使用 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\")").

另外参考 this 问题,我将查询更改为:-

(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', 有人可以帮忙吗?

#Update1

我试过第一个答案。它工作正常,但我怎样才能改变它在 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)));

这是导致错误的原因

Unable to cast object of type '<>f__AnonymousType15`2[System.Object,System.Object]' to type 'System.IConvertible'.

您可以使用 DataRow 字符串索引器方法提取 price 列作为 object,然后使用 AsEnumerable 从 Dynamic LINQ to LINQ to Objects 转换,这让你 IEnumerable<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();