2009-09-01 7 views
0

두 필드 곱의 합을 계산해야합니다. 평균 가중 가격으로 사용됩니다. avgPrice = sum (price * volume)/sum (volume). price1 및 price2 반환 오류 "지정한 캐스트가 유효하지 않습니다."LINQ 집계 쿼리의 두 필드 곱

 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"))) 


        }; 
+0

= grouped.Sum (예 => (10 진수) 전자 [ "볼륨"])? 또는 volume = grouped.Sum (e => (decimal) e [ "symbol"])을 설정하면? 여전히 캐스팅 오류가 발생합니까? –

+0

안녕하세요, 쿼리가 단일 필드에 대해 잘 작동합니다. 그룹화 할 수 있습니다. 문제없이 eum (> = (10 진수) e [ "볼륨"]). 제가 할 수없는 것은 두 분야의 제품, 부문 또는 가치의 합을 얻는 것입니다. 그건 내가 합계 (가격 * 가격)을 얻을 수 없다는 것입니다. 단일 필드에 대해 간단한 합계, 최소 및 최대 값 이외의 계산 된 평균 및 집계 된 값에 LINQ를 사용하고 싶습니다. –

답변

0

당신이 DataRow에서 값을 받고 관련이보고있는 문제. volumeint이고 symboldouble 인 것처럼 보입니다. 그러나 오류 라인에서는 서로 다른 유형으로 사용하고 있습니다. 대등 한 예는이 작업을 수행하려고 할 것입니다 : 당신이 doubledecimal A와를 언 박싱 위해 노력하고 있기 때문에

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) 
    ... 
}; 
+0

안녕하세요. 답변 주셔서 감사합니다. 나는 실제로 유형을 혼합했다. 이것은 잘 작동 : averagePrice = grouped.Sum (예 => (e.Field ("볼륨") * e.Field ("가격")))/grouped.Sum (예 => (INT) e [ "volume"]) –

+1

도와 줘서 기쁩니다. 나중에 참조 할 경우 필드 확장 메서드는 실제로 DBNull을 처리하므로 nullable 형식에만 유용합니다. 값 유형의 경우 직접 캐스팅 할 수도 있습니다. – dahlbyk

+0

눈치 챘을지도 모르겠지만 저는 LINQ에서 아주 새로운 제품입니다. 프로젝트를 완료하려고합니다. 좀 더 복잡한 개념을 이해하기 위해서는 진지한 학습이 필요합니다. 당신의 대답은 첫 번깨에 나를 도왔습니다. 다시 한 번 감사드립니다, 죄송합니다. –