类型 '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();
我有一个数据 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();