2016-04-25 16 views
2

Ich benutze Linq mit DataSet für Excel-Multi-Blatt. Wie verwendet man die Gruppierung nach LINQ?Wie verwendet man "Gruppieren nach" LINQ?

Beispieldaten:

Name  | Rate | Date  | Code | ROW_SEQ 
A   | 12 | 01/01/2015 | 12 | 1 
B   | 13 | 01/01/2015 | 12 | 2 
Sub Total | 25 | 01/01/2015 | 12 | 
C   | 10 | 01/01/2015 | 12 | 3 
Grand Total | 35 | 01/01/2015 | 12 | 
D   | 15 | 10/01/2015 | 15 | 1 
E   | 16 | 10/01/2015 | 15 | 2 
Sub Total | 31 | 10/01/2015 | 15 | 
F   | 10 | 10/01/2015 | 15 | 3 
Grand Total | 41 | 10/01/2015 | 15 | 

C# Code:

protected void btnExportExcel_Click(object sender, EventArgs e) 
{    
    /*== How to use Group by LINQ? ==*/ 
    DataSet dsTmp = new DataSet(); 
    DataTable dtTmp = dtExport.Copy(); 
    var grouped = from table in dtTmp.AsEnumerable() 
     group table by new { date_Col = table["date"] , code_Col = table["code"] } into groupby 
     select new 
     { 
      Value = groupby.Key, 
      ColumnValues = groupby 
     }; 
    /*== How to use Group by LINQ? ==*/ 

    foreach (var key in grouped) 
    { 
     dtTmp = new DataTable(); 
     dtTmp = dtExport.Clone(); 
     dtTmp.TableName = (key.Value.settle_date_Col + "-" + key.Value.bank_code_Col).Replace("00:00:00", "").Replace("/",""); 
     foreach (var rw in key.ColumnValues) 
     { 
      dtTmp.ImportRow(rw); 
     } 
     dtTmp.AcceptChanges(); 
     dsTmp.Tables.Add(dtTmp.Copy()); 
    } 
    dsTmp.AcceptChanges(); 
    string fileName = string.Format("{0}_{1}.xls", this._ID, DateTime.Now.ToString("yyyyMMdd_HHmmss")); 
    ExcelMultiSheet.ToExcel(dsTmp, fileName, Page.Response);   

} 

-Code Ergebnisse:

Sheet1 
Name  | Rate | Date  | Code | ROW_SEQ 
A   | 12 | 01/01/2015 | 12 | 1 
B   | 13 | 01/01/2015 | 12 | 2 
C   | 10 | 01/01/2015 | 12 | 3 

Sheet2 
Name  | Rate | Date  | Code | ROW_SEQ 
Sub Total | 25 | 01/01/2015 | 12 | 
Grand Total | 35 | 01/01/2015 | 12 | 

Sheet3 
Name  | Rate | Date  | Code | ROW_SEQ 
D   | 15 | 10/01/2015 | 15 | 1 
E   | 16 | 10/01/2015 | 15 | 2 
F   | 10 | 10/01/2015 | 15 | 3 

Sheet4 
Name  | Rate | Date  | Code | ROW_SEQ 
Sub Total | 31 | 10/01/2015 | 15 | 
Grand Total | 41 | 10/01/2015 | 15 | 

Aber ich brauche Ergebnisse:

Sheet1 
    Name  | Rate | Date  | Code | ROW_SEQ 
    A   | 12 | 01/01/2015 | 12 | 1 
    B   | 13 | 01/01/2015 | 12 | 2 
    Sub Total | 25 | 01/01/2015 | 12 | 
    C   | 10 | 01/01/2015 | 12 | 3 
    Grand Total | 35 | 01/01/2015 | 12 | 

Sheet2 
    Name  | Rate | Date  | Code | ROW_SEQ 
    D   | 15 | 10/01/2015 | 15 | 1 
    E   | 16 | 10/01/2015 | 15 | 2 
    Sub Total | 31 | 10/01/2015 | 15 | 
    F   | 10 | 10/01/2015 | 15 | 3 
    Grand Total | 41 | 10/01/2015 | 15 | 

Dank voraus. :)

+0

auf der Grundlage dieser Daten und der Gruppe von Ihnen verwenden, sollten Sie nur zwei Gruppen bekommen. Sind Sie sicher, dass die Untersummen und Gesamtsummen weder für das Datum noch für den Code unterschiedliche Werte haben? Vielleicht ist der zeitliche Teil der Daten anders? – juharr

+0

@juhar ich sicher, dass Untersummen und Gesamtsummen keine unterschiedlichen Werte haben. – nettoon493

+0

Ist es möglich, dass sich die Typen unterscheiden? Vielleicht haben die Sub-Toal- und Grand-Total-Zeilen String-Werte anstelle von 'DateTime' und' Int' oder umgekehrt. – juharr

Antwort

-1

können Sie mögen verwenden diese

var results = from p in persons 
       group p.car by p.PersonId into g 
       select new { PersonID = g.Key, Cars = g.ToList() };