2016-12-01 2 views
1

So habe ich einen Datensatz wie folgt aus:Einfache LINQ Datatable Aggregation funktioniert nicht

Group Value 
A  1 
A  2 
B  2 
B  5 

einfach möchte ich nur:

Group Value 
A  3 
B  7 

als eine weitere Datentabelle Variable. Hier ist mein C# -Code.

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(); 
     } 
    } 
} 

Es gibt mir Fehler in CopyToDataTable() sagte:

enter image description here

Wer weiß, was in meinem Codes schief geht? Vielen Dank!

+0

Bitte, senden Sie CopyToDataTable Methode Implementierung. Das Problem besteht darin, dass Ihre Aggregatfunktion einen anonymen Typ verwendet und beim Versuch, die CopyToDatatable-Methode aufzurufen, den anonymen Typ nicht in einen konkreten Typ umwandeln kann. Um besser mit dem Problem zu helfen, post Ihre Methode – Stormhashe

+0

@Stormhashe Das OP verwendet die ['CopyToDataTable' Erweiterung] (https://msdn.microsoft.com/en-us/library/bb396189 (v = vs.110). aspx), das vom Framework bereitgestellt wird. Das Problem besteht darin, dass für die Erweiterung eine Sammlung von DataRow-Objekten als Eingabe erforderlich ist. –

+0

Ahh ich verstehe, Danke! – Stormhashe

Antwort

1

Mit etwas leichter von der Hand kann man eine datarow Sammlung in der from Anweisung erstellen, indem Sie eine where-Anweisung Weisen Sie das ItemArray eines Datenobjekts zu und prüfen Sie, ob es null ist. So etwas wie dieses:

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(); 
} 
Verwandte Themen