如何使用LINQ获取IEnumerable中两个属性的乘积?

时间:2015-07-07 12:59:38

标签: c# linq dynamic

我使用Dapper从SQL查询中得到IEnumerable<dynamic>,我想在IEnumerable中将动态对象的两个属性的乘积加在一起。

我试过了:

decimal total = orderDetails.Aggregate((workingTotal, detail) => 
    workingTotal + (detail.quantity * detail.unitPrice));

但是返回一个无法转换为小数的object

3 个答案:

答案 0 :(得分:2)

我会使用Sum代替Aggregate

decimal total = orderDetails.Sum(x => (decimal) (x.quantity * x.unitPrice));

根据你的具体情况而定,我可以想象这可能在没有任何演员表的情况下工作,或者需要更多的演员阵容......用dynamic来判断并不总是很容易。

答案 1 :(得分:1)

编译器不知道detail.quantitydetail.unitPrice的类型,因此您需要强制转换它们。 此外,您需要another Aggregate overload,其中一个具有种子值:

decimal total = orderDetails.Aggregate((decimal)0, (workingTotal, detail) =>
            workingTotal + ((decimal)detail.quantity * (decimal)detail.unitPrice));

当然,您可以更轻松地使用Sum代替Aggregate

答案 2 :(得分:0)

由于您正在使用动态,编译器不知道detail.quantity等是什么。因此,您需要明确地将其转换为decimal

decimal total = (decimal)orderDetails.Aggregate((workingTotal, detail) => 
     workingTotal + (detail.quantity * detail.unitPrice));