2009-09-01 8 views
0

2つのフィールドの積の和を計算する必要があります。これは平均加重平均価格に使用されます。 avgPrice =合計(価格*ボリューム)/合計(ボリューム)。 price1とprice2の両方がエラー "指定されたキャストは無効です。"LINQ集計クエリの2つのフィールドの積

 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 =>(10進数)E [ "ボリューム"])?またはvolume = grouped.Sum(e =>(10進)e ["symbol"])を設定した場合はどうなりますか?まだキャストエラーが出ますか? –

+0

こんにちは クエリは1つのフィールドに対してうまく機能します。私はグループ化することができます.Sum(e =>(10進)e ["volume"])問題なし。私ができないことは、2つのフィールドから商品、部門、または価値の合計を得ることです。それは私が合計(ボリューム*価格)を得ることはできません。私はLINQを計算した平均値と、単一フィールド上の単純な合計、最小値および最大値以外の集計値に使用したいと考えています。 –

答えて

0

あなたが見ている問題は、DataRowから値を取得に関連しています。 volumeintで、symboldoubleですが、エラーラインにはどちらか一方を別のタイプとして使用しています。同等の例は、これを実行しようとしていることでしょう:あなたはdecimalとしてdoubleをVHS版しようとしているので、

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

こんにちはdahlbyk。あなたの答えをありがとう。私は実際にタイプを混ぜていました。 は、これがうまく機能: averagePrice = grouped.Sum(E =>(e.Field ( "ボリューム")* e.Field ( "価格")))/ grouped.Sum(E =>(INT) e ["volume"]) –

+1

喜んで助けてください。将来の参照のために、フィールド拡張メソッドは、DBNullを処理するため、実際にはヌル可能型に対してのみ役に立ちます。値の型については、直接キャストすることもできます。 – dahlbyk

+0

あなたが気づいたように、私はLINQで全く新しいです。プロジェクトを完了しようとしています。より複雑な概念を理解するために、私は真剣な学習をする必要があります。あなたの答えは、最初のバンプの上に私を助けました。もう一度、罪をありがとう。 –

関連する問題