2016-03-24 21 views
0

DataTableからの値を集計するためにlinqクエリがうまく機能しています。Linqクエリ - 動的データ型

考えられるのは、ユーザーがフィールドのリストの1つを選択でき、linqが選択したフィールドに従ってデータを集約するということです。

p_measureは、選択したフィールドの名前を示す文字列変数です。

しかし、現在のフォームでは、選択されたフィールドがソーステーブルのデータ型が「float」の場合にのみ、このすべてが機能します。 ユーザーが 'int'を選択した場合、キャスト例外がスローされます。

質問がありますが、私はこのコードをさまざまなデータ型を扱うために「動的」にしていますか?

// Table for receiving aggregated results 
var table = new DataTable(); 
table.Columns.Add(p_dimension, typeof(String)); 
table.Columns.Add(p_measure, typeof(Double)); 

// Query to perform aggregation 
DataTable query = (from r in rootDT.AsEnumerable() 
        group r by new 
          { 
           Dimension = r.Field<string>(p_dimension) 
          } into g 
          select new 
          { 
           Dimension = g.Key.Dimension, 
           Measure = g.Sum(x => x.Field<double>(p_measure)) 
          } 
         ).Aggregate(table, (dt, r) => dt.Rows.Add(r.Dimension,r.Measure); return dt; }); 

Iが "新しいデータテーブル" 宣言(4行目)タイプを扱うことができる:従って、タイプ型の変数を設定&を生成することによって

table.Columns.Add(p_measure, typeof(Double)); 

table.Columns.Add(p_measure, myTypeVariable); 

しかし、私はこの問題をどのように扱うのか迷っています:

x.Field<double>(p_measure) 

+0

あなたは 'x.Field ' – esiprogrammer

+0

を試してみましたか?はいの場合は、テーブル全体をメモリに引き込み、メモリ内のすべてのクエリを実行していることを認識していますか? – Euphoric

+0

これはすでにメモリ内のデータテーブルです。ユーザーは、単にdataGridView内のすべてのレコードを表示したいだけでなく、グループ化された合計を示すグラフを表示するだけです。私は大規模なレコードセットであれば、データベースで重い作業をすることを検討すべきだと私は理解しています。 – Esby

答えて

1

あなたは結果は常にあなたはそれが唯一の任意の数値型、またはその値が全てdoubleに解析できる文字列カラム上の意志

Measure = g.Sum(x => Convert.ToDouble(x[p_measure])) 

を使用することができますdoubleになりたい場合。

+0

ブリリアント!ありがとうございました。ちょうどLinqをはじめて使うことを始めたばかりで、それが私にはもっと混乱しているはずだと思います。何らかの理由で私は標準的なキャストがクエリキック内で動作しないと思っていました。 – Esby

+1

@ user3379697うれしいです。はっきりするために - それは "キャスト"ではありません。それは「コンバージョン」です。コンバージョンはあるタイプを別のタイプに変換します。キャストは、メソッド呼び出しをバインドするときに変数がどのように扱われるかを変更するだけです。互換性のあるデータ型ではないため、 'int'を' double'に「キャスト」することはできません。基礎となるメモリは異なります。 –