集計クエリ内の二つのフィールドのLINQ製品
質問
私は2つのフィールドの積の合計を計算する必要があります。これは加重平均価格のために使用されます。 avgPrice =合計(価格*ボリューム)/ SUM(ボリューム)。 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
であるように見えますが、あなたのエラー行であなたは、別のタイプのような1つまたは他のを使用しています。同等の例は、これを実行しようとしていることになります。
object o = 3.0; // double
decimal m = (decimal)o;
あなたはdouble
としてdecimal
をVHS版しようとしているので、これが失敗します。一方、これは正常に動作します:
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)
...
};
所属していません StackOverflow