聚合查询中两个字段的LINQ乘积

聚合查询中两个字段的LINQ乘积,linq,grouping,field,product,Linq,Grouping,Field,Product,我需要计算两个域的乘积之和。这将用于平均加权价格。 avgPrice=总价格*数量/总数量。指定的price1和price2返回错误强制转换无效 var result3 = from sym in dataTableAsEnumerable() group sym by new { symbol = sym["symbol"] } into grouped select new

我需要计算两个域的乘积之和。这将用于平均加权价格。 avgPrice=总价格*数量/总数量。指定的price1和price2返回错误强制转换无效

     var result3 = from sym in dataTableAsEnumerable()
                   group sym by new { symbol = sym["symbol"] } into grouped
                   select new
                   {
                      //             SYMBOL = sym.Field<string>("symbolCAN"),
                      SYMBOL = grouped.Key.symbol,
                      tradeTimeMin = grouped.Min(e => e["tradeTimeMin"]),
                      tradeTimeMax = grouped.Max(e => e["tradeTimeMax"]),
                      volume = grouped.Sum(e => (int)e["volume"] ),
                      price1 = grouped.Sum(e => (double)e["volume"] * (double)e["symbol"]) / grouped.Sum(e => (double)e["volume"]),
                      price2 = grouped.Sum(e => ( e.Field<decimal>("volume") * e.Field<decimal>("symbol")))


                   };

您看到的问题与从DataRow中获取值有关。看起来volume是int,symbol是double,但在错误行中,您使用了其中一个作为不同的类型。一个类似的例子是尝试这样做:

object o = 3.0; // double
decimal m = (decimal)o;
这将失败,因为您试图将双精度解装箱为十进制。另一方面,这很好:

object o = 3.0; // double
double d = (double)o;
decimal m = (decimal)d;
要修复您的示例,您需要首先将值强制转换为正确的类型,然后进行相应的强制转换,或者仅使用隐式强制转换:

    ...
    price = grouped.Sum(e => e.Field<int>("volume") * e.Field<double>("symbol")) /
            grouped.Sum(e => e.Field<int>("volume"))
    ...
或者使用匿名类型使最终选择更具可读性:

...
let data = grouped.Select(e => new {
   Volume = e.Field<int>("volume"),
   Symbol = e.Field<double>("symbol")
})
select new
{
    ...
    price = data.Sum(x => x.Volume * x.Symbol) / data.Sum(x => x.Volume)
    ...
};

如果设置volume=grouped.Sume=>decimale[volume],会发生什么?或者如果设置volume=grouped.Sume=>decimale[symbol]?您是否仍然得到转换错误?您好,查询对于单个字段运行良好。我可以分组。Sume=>decimale[volume]没有问题。我不能做的是从两个字段中得到乘积、除法或值的和。也就是说,我无法得到总量*价格。我希望使用LINQ来计算平均值和聚合值,而不是单个字段上的简单求和、最小值和最大值。谢谢你的回答。我确实是在混血。这很有效:averagePrice=grouped.Sume=>e.Fieldvolume*e.Fieldprice/grouped.Sume=>inte[volume]很乐意帮忙。对于您将来的参考,字段扩展方法实际上只对可为null的类型有用,因为它处理DBNull。对于值类型,您可以直接进行转换。您可能已经注意到,我在LINQ是全新的。只是想完成一个项目。要理解更复杂的概念,我需要认真学习。你的回答帮助我克服了第一个障碍。再次感谢你,辛。