2016-12-01 9 views
1

動作しないので、私はこのようなデータセットを持っている:シンプルLINQ DataTableの集約が

Group Value 
A  3 
B  7 

別のDataTableの変数として:

Group Value 
A  1 
A  2 
B  2 
B  5 

は単に私は持っていると思います。ここに私のC#のコードです。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Data; 
using System.Data.OleDb; 
using System.Globalization; 
using System.IO; 
using utilityClass; 

namespace testData 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      DataTable dt = new DataTable(); 
      string path = "test_data.csv"; 
      bool isFirstRowHeader = true; 
      dt = Utils.GetDataTableFromCsv(path, isFirstRowHeader); 

      var results = from row in dt.AsEnumerable() 
          group row by row.Field<string>("Group") into grp 
          select new 
          { 
           Id = grp.Key, 
           sum = grp.Sum(r => r.Field<int>("Value")) 
          }; 
      DataTable newDataTbl = results.CopyToDataTable(); 
     } 
    } 
} 

それは(CopyToDataTableに私にエラーを与える)と言っ:

enter image description here

誰もが私のコードではうまくいかないものを知っていますか?ありがとう!

+0

CopyToDataTableメソッドの実装を投稿してください。問題は、集計関数が匿名型を使用していることと、CopyToDatatableメソッドを呼び出そうとするときに、匿名型を具体的な型にキャストできないことです。問題をより良く解決するために、あなたのメソッドを投稿してください。 – Stormhashe

+0

@Stormhashe OPは[CopyToDataTable'拡張]を使用しています(https://msdn.microsoft.com/en-us/library/bb396189(v=vs.110))。 aspx)を提供しています。問題は、拡張が 'DataRow'オブジェクトの集合を入力として必要とすることです。 –

+0

ああ、ありがとう! – Stormhashe

答えて

1

手のわずかのビットを使用すると、にどこ文を使用してfrom文でのDataRowコレクションを作成することができますdatarowオブジェクトのItemArrayを割り当てて、nullかどうかを調べます。このようなもの:

static void Main(string[] args) 
{ 

    DataTable dt = new DataTable(); 
    string path = "test_data.csv"; 
    bool isFirstRowHeader = true; 
    dt = Utils.GetDataTableFromCsv(path, isFirstRowHeader); 
    var results = from row in dt.AsEnumerable() 
        group row by row.Field<string>("Group") into grp 
        let dr = dt.NewRow() 
        where (dr.ItemArray = new object[] { grp.Key, grp.Sum(r => r.Field<int>("Value")) }) != null 
        select dr ; 
    DataTable newDataTbl = results.CopyToDataTable(); 
} 
1

結果はDataRowsのシーケンスではありません。 CopyToDataTable()は、でのみ利用可能です。ここで、Tは、DataRow(詳細はlink)です。 引用したlinkに記載されているように、これに対する解決策があります。あなたはリフレクションを使用して行われました回避策を実装する必要があるとしていることを行うには:

How to: Implement CopyToDataTable Where the Generic Type T Is Not a DataRow