2016-04-24 6 views
0

Ich wurde über einen Teil des Codes gebunden Ich muss schreiben. Ich habe eine XML-Datei, die ich importieren und nachbearbeiten muss, damit ich in einer Datagridview zeigen kann, was ich brauche. Es basiert alles auf einer Klasse Rechnung:C# linq Split-Liste in zwei Teile nach Entity-Wert

Innerhalb der Importdatei gibt es mehrere Einträge für die Rechnung. (Eine pro Rechnung Zeile) Also habe ich eine Gruppierung mit der folgenden Anweisung.

invoices = invoices.GroupBy(i => new 
          { 
           i.InvoiceNbr, 
           i.AltInvoiceNbr, 
           i.CCN, 
           i.CustomerNbr, 
           i.AltCustomerNbr, 
           i.InvoiceDate, 
           i.PrintSeq 
          }).Select(i => new Invoice() 
          { 
           InvoiceNbr = i.Key.InvoiceNbr, 

           AltInvoiceNbr = i.Key.AltInvoiceNbr, 
           CCN = i.Key.CCN, 
           CustomerNbr = i.Key.CustomerNbr, 
           AltCustomerNbr = i.Key.AltCustomerNbr, 
           InvoiceDate = i.Key.InvoiceDate, 
           Amount = i.Sum(x => decimal.Parse(x.Amount)).ToString("F"), 
           FreightAmount = i.Sum(x => decimal.Parse(x.FreightAmount)).ToString("F"), 
           InsuranceAmount = i.Sum(x => decimal.Parse(x.InsuranceAmount)).ToString("F"), 
           TaxAmount = i.Sum(x => decimal.Parse(x.TaxAmount)).ToString("F"), 
           TaxFreightAmount = i.Sum(x => decimal.Parse(x.TaxFreightAmount)).ToString("F"), 
           PrintSeq = i.Key.PrintSeq 
          }).ToList(); 

So sieht die Ausgabe in einem Datagridview gut aus. Jetzt gibt es einige Reihen, z.B. für Gutschriften (oder Teillieferungen), bei denen die Rechnungsnummer zweimal oder öfter erscheint. In diesem Fall ist PrintSeq> 1.

Ich muss diese Daten herausfiltern.

z.B. Für eine Gutschrift gibt es zwei Einträge. Eins mit InvoiceNbr 20160420-1 mit einem Betrag von 50 $ und ein weiteres mit der gleichen InvoiceNbr mit einem Betrag von -50 $.

Die printSeq für + 50 $ Rechnung 1. Die printSeq für -50 $ Rechnung 2.

ich mit

.Where(x=>x.PrintSeq = 1) 

zu filtern versucht, aber in diesem Fall einen Eintrag bleibt in der Ausgabe.

Wenn ich

.Where(x=>x.PrintSeq != 1) 

erhalte ich eine Liste, die die InvoiceNbrs zeigt, die ich will nicht in den Ausgang zeigen.

So suche ich jetzt eine Möglichkeit, diese Liste zu verwenden, um alle invoiceNbrs auf der ursprünglichen Ausgabe mit Lambda-Ausdrücken herauszufiltern.

(Select * von Rechnungen wo originallist.invoicenbr filterlist.invoicenbr NICHT)

I nicht externe Bibliotheken usw. (distinctby) ich auf der ursprünglichen Liste verschieden zu verwenden versucht, verwenden möchten, indem Verwenden einer verschachtelten Gruppe zuerst, aber das scheint nicht der richtige Weg.

Bitte helfen

Antwort

0
 SetInvoices(); //fills List<Invoice> invoices 

     SetManualInvoices(); 
     // fills List<Invoice> manualinvoices with .Where(x=> x.printSeq >1) 

     invoices = invoices.Where(i=> !manualinvoices.Any(m=>m.InvoiceNbr == i.InvoiceNbr)) 
     .ToList(); 
     //select every invoice from invoices where invoicenbr is not in manualinvoices. 
     return invoices; 

Dank: D