2009-09-01 72 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(E =>(十進制)E [ 「音量」])?或者如果你設置volume = grouped.Sum(e =>(decimal)e [「symbol」])?你仍然得到了演員的錯誤? – 2009-09-01 16:53:55

+0

嗨, 該查詢適用於單個字段。我可以分組.Sum(e =>(十進制)e [「音量」))沒有問題。我不能做的是從兩個領域獲得產品,部門或價值總和。那是我無法得到總和(音量*價格)。我希望使用LINQ來計算平均值和彙總值,而不是簡單的總和,最小值和最大值。 – 2009-09-01 17:49:19

回答

0

您看到的問題與從DataRow中獲取值有關。它看起來像volume是一個intsymbol是一個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) 
    ... 
}; 
+0

嗨達爾比克。謝謝您的回答。我確實是混合類型。 此工作良好: averagePrice = grouped.Sum(E =>(e.Field ( 「卷」)* e.Field ( 「價格」)))/ grouped.Sum(E =>(int)的e [「volume」]) – 2009-09-02 13:23:58

+1

很高興爲您提供幫助。爲了您以後的參考,字段擴展方法實際上僅對可空類型有用,因爲它處理DBNull。對於值類型,您不妨直接投射。 – dahlbyk 2009-09-02 13:43:45

+0

好吧,你可能已經注意到了,我是LINQ的全新產品。只是想完成一個項目。要理解更復雜的概念,我需要認真學習。你的回答幫助我解決了第一個問題。再次感謝罪。 – 2009-09-02 18:54:47