집계 된 쿼리에서 두 필드의 LINQ 제품
문제
두 분야의 제품 합계를 계산해야합니다. 이것은 평균 가중 가격에 사용됩니다. 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
a double
, 그러나 오류 라인에서 하나 또는 다른 하나를 다른 유형으로 사용하고 있습니다. 비슷한 예는 이것을 시도하는 것입니다.
object o = 3.0; // double
decimal m = (decimal)o;
Unbox a를 시도하기 때문에 이것은 실패합니다 double
A로 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)
...
};
제휴하지 않습니다 StackOverflow