2016-06-16 7 views
3

私のタイトルは少し混乱しますのでここで説明します。C#LINQ:グループ化されたクエリの値の合計を含むプロパティと値を動的に作成します。

var results = from row in toSearch.AsEnumerable() 
       group by row.Field<String>("Somename") into grp 
       select new 
         { 
         GroupMe = grp.Key, 

         foreach (var k in someDic.Keys){ 
           TODOPROPERTYNAMEFROMk = grp.sum(x => grp.k); 
         } 
          }; 

これは私が達成したいものの一般的な考え方です:

これは私のサンプルクエリと私は達成したいです。キーの辞書に基づいて、グループ化されたクエリからデータを集計しながら、キーからプロパティ名を作成する必要があります。合計はキーの値に基づいて決まります。
toSearchはデータテーブルであり、辞書のすべてのキーがデータテーブルのヘッダーの一部を構成します。私は、このソリューションを与えた(私は....申し訳ありません作者を失った)これは私には不可能だと私はいくつかのソースとそれの1を検索しました:

//For generating dynamic objects fr 
    public static object DynamicProjection(object input, IEnumerable<string> properties) 
{ 
    var type = input.GetType(); 
    dynamic dObject = new System.Dynamic.ExpandoObject(); 
    var dDict = dObject as IDictionary<string, object>; 

    foreach (var p in properties) 
    { 
     var field = type.GetField(p); 
     if (field != null) 
      dDict[p] = field.GetValue(input); 

     var prop = type.GetProperty(p); 
     if (prop != null && prop.GetIndexParameters().Length == 0) 
      dDict[p] = prop.GetValue(input, null); 
    } 

    return dObject; 
} 

私はこの

ようにそれを使用しようとしました
var results = from row in toSearch.AsEnumerable() 
      group by row.Field<String>("Somename") into grp 
      select grp; 
var test = results.Select(x => DynamicProjection(x,someDic.Keys)); 

これは、私が利用できなかった、または少なくともプロパティを呼び出すことができないオブジェクトを私に与えました。私は本当に元のものを達成するための助けに感謝し、長いポストのために残念です。

編集が 期待入力がDataTableの例です:ヘッダーによって

Fee | Fi | Fo | Fum 
cat | ds | 2 | 93 
cow | ff | 5 | 120 
cat | ds | 9 | 33 
cow | jk | 1 | 133 

グループ:受信料
ヘッダ:Foは、FUM
予想される出力:

cat | 11 | 126 
cow | 6 | 253 

勝者:牛、だから牛を採用する*ちょっと冗談を言って

+0

はあなたが私たちに入力し、(予想)出力形式を表示することができますか? –

+0

@HariPrasad更新されました:これを読んでいただきありがとうございます –

+0

受信したヘッダーに基づいて、それらの列の合計が必要ですか? –

答えて

0

私はExpandoObjectに慣れていません(私の議論は間違っているかもしれません)、Dictionary<columnname, sum>で作業することができます。

私はDictionaryのヘッダーとそれぞれの合計を返すことをお勧めします。

// ex -- Given following header 
List<string> headers = new List<string>(); 
headers.Add("fo"); 
headers.Add("fum");  

DataTable dt; // Assign correct data source. 
var results =dt.AsEnumerable() 
     .GroupBy(g=>g.Field<string>("fee"))  
     .Select(x=> new 
       { 
        x.Key, 
        dict = headers.ToDictionary(h=>h, h=>x.Sum(s=>s.Field<int>(h))) 
       }) 
     .ToList(); 

このクエリは、fee列にグループ化され、特定のヘッダー列の合計を計算します。

チェックこのDemo

出力:

Key=cat, column fo , Sum 11, column fum , Sum 126 
Key=cow, column fo , Sum 6, column fum , Sum 253 
+0

ありがとう!これは私の選択の中にforループを含めることはできませんが、それは私に代替手段を提供します。誰かが私にforループソリューションを提供できるかどうかを待っています。それ以外は壊れます。 ursを答えとしてマークしてください:)乾杯! –

+0

なぜ 'for loop'が必要ですか?これはすでにあなたのために仕事をしています。または私は何かを逃した? –

+0

forループを使うと、1つのlinq文の中で複雑なクエリを実行できます。この考え方は、if文のような追加の要件を実行できるようにすることです。 Urの答えは良いですが、私は残念ながら私の複雑さのレベルに収まる答えが必要です。それ以前に約束したように、この解決策に邪魔されることはありません:) –

関連する問題