Проблема, с которой вы столкнулись, связана с получением значений из DataRow
. Похоже, что volume
- это int
, а symbol
- это double
, но в строках ошибок вы используете один или другой в качестве другого типа. Сравнительный пример будет пытаться сделать это:
object o = 3.0; // double
decimal m = (decimal)o;
Это не удастся, потому что вы пытаетесь распаковать double
как decimal
. С другой стороны, это прекрасно работает:
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)
...
};