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

本文关键字:属性 两个 获得 LINQ 何使用 IEnumerable | 更新日期: 2023-09-27 18:01:35

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

I tried:

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

,但返回的object不能转换为小数

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

我将使用Sum代替Aggregate:

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

根据你的具体情况,我可以想象这可能不需要任何类型转换,或者需要更多类型转换…使用dynamic并不总是很容易分辨。

编译器不知道detail.quantitydetail.unitPrice的类型,所以需要对它们进行强制类型转换。此外,您还需要另一个Aggregate重载,其种子值为:

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

当然,您可以使用Sum来代替Aggregate,这更容易。

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

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