2014-02-22 14 views
10

Daten sind eine lokale CSV-Datei, die über OleDB in einen Ado.net-Datensatz geladen wird. Die Tabelle enthält mehr als 40 Spalten mit Rechnungsdetails. Jede Zeile ist eine separate Position innerhalb einer Rechnung, die aus 1 bis n Zeilen bestehen kann.LINQ - Gruppe/Summe mehrerer Spalten

Die Abfrage wird verwendet, um die Rechnungsdetails in einer einzigen Zeile pro Rechnung zu gruppieren, wobei der Rechnungsbetrag und der Saldo zusammengerechnet werden.

Folgendes funktioniert, was ich versuche festzustellen: Ist es möglich, dies in einer einzigen Abfrage zu tun?

//group the invoices by invoicenumber and sum the total 
//Zoho has a separate record (row) for each item in the invoice 
//first select the columns we need into an anon array 
var invoiceSum = 
    DSZoho.Tables["Invoices"].AsEnumerable() 
    .Select (x => 
     new { 
      InvNumber = x["invoice number"], 
      InvTotal = x["item price"], 
      Contact = x["customer name"], 
      InvDate = x["invoice date"], 
      DueDate = x["due date"], 
      Balance = x["balance"], 
      }); 
    //then group and sum 
    var invoiceTotals = 
     invoiceSum 
     .GroupBy (s => new {s.InvNumber, s.Contact, s.InvDate, s.DueDate}) 
     .Select (g => 
      new { 
       InvNumber = g.Key.InvNumber, 
       InvDate = g.Key.InvDate, 
       DueDate = g.Key.DueDate, 
       Contact = g.Key.Contact, 
       InvTotal = g.Sum (x => Math.Round(Convert.ToDecimal(x.InvTotal), 2)), 
       Balance = g.Sum (x => Math.Round(Convert.ToDecimal(x.Balance), 2)), 
       }); 
+2

Sie GroupBy platzieren können direkt nach dem ersten auswählen , ohne Einführung RechnungTotals Variable – Uriil

+0

möglich Duplikat von [Nach mehreren Spalten gruppieren] (http://StackOverflow.com/Questions/847066/Group-By-Multiple-Columns) – psubsee2003

Antwort

23

Sie sind in der Tat, tun nur eine Abfrage, wenn Sie die Ergebnisse von invoiceTotals verwenden. In dem Code, den Sie zeigen, sind Sie sogar nicht eine Abfrage in der Datenbank.

Google „Linq verzögerte Ausführung“, dann ist es raffinierte ;-)

Aber wie Uriil sagt, können Sie einfach die Anweisungen in einer Linq-Abfrage kombinieren:

var invoiceSum = 
DSZoho.Tables["Invoices"].AsEnumerable() 
.Select (x => 
    new { 
     InvNumber = x["invoice number"], 
     InvTotal = x["item price"], 
     Contact = x["customer name"], 
     InvDate = x["invoice date"], 
     DueDate = x["due date"], 
     Balance = x["balance"], 
     } 
) 
.GroupBy (s => new {s.InvNumber, s.Contact, s.InvDate, s.DueDate}) 
.Select (g => 
     new { 
      InvNumber = g.Key.InvNumber, 
      InvDate = g.Key.InvDate, 
      DueDate = g.Key.DueDate, 
      Contact = g.Key.Contact, 
      InvTotal = g.Sum (x => Math.Round(Convert.ToDecimal(x.InvTotal), 2)), 
      Balance = g.Sum (x => Math.Round(Convert.ToDecimal(x.Balance), 2)), 
      } 
); 
+0

Ah- danke für die Hilfe. 'linq verzögerte Ausführung' Hatte den Begriff vorher auch nicht gehört. Ich schätze die Eingabe und Hilfe. – topry

+0

Whoo.Thats beste Antwort, die ich jemals auf Stack bekommen habe. (Y) – RachitSharma

Verwandte Themen