2016-04-24 10 views
0

私は書く必要があるコードの一部に縛られてしまいました。 私はインポートして再加工しなければならないxmlファイルを持っているので、私はDataGridviewで必要なものを表示することができます。すべてがクラスに基づいています。請求書:C#linqはエンティティ値で2つの部分に分割します

public class Invoice 
{ 
    public bool import { get; set; } 
    public string InvoiceNbr { get; set; } 
    public string AltInvoiceNbr { get; set; } 
    public string CustomerNbr { get; set; } 
    public string AltCustomerNbr { get; set; } 
    public DateTime InvoiceDate { get; set; } 
    public string Amount { get; set; } 
    public string FreightAmount { get; set; } 
    public string InsuranceAmount { get; set; } 
    public string TaxAmount { get; set; } 
    public string TaxFreightAmount { get; set; } 
    public int PrintSeq { get; set; } 
} 

インボイスチェンには複数のエントリがあります。 (請求書明細ごとに1つ) 私は次のステートメントでグループ化しました。

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

したがって、出力はdatagridviewでうまく見えます。現在、いくつかの行があります。請求書番号が2回以上現れるクレジット(または部分的な出荷)の場合。この場合、PrintSeqは> 1です。

私はそのデータを除外する必要があります。

クレジットのために2つのエントリがあります。 金額が50 $のInvoiceNbr 20160420-1と、金額が-50 $の同じInvoiceNbrを持つ の1つ。

printSeq + 50 $のために請求書が-50 $請求書1. printSeqである私は

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

でフィルタリングしてみました2.

であるが、この場合、1つのエントリがにとどまります出力。

私は

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

を使用している場合は、私は私が出力に表示したくないInvoiceNbrsを示しリストを得ます。

ここで、そのリストを使用して、元の出力のすべての請求書Nbrをラムダ式で除外することができます。

(originallist.invoicenbrがfilterlist.invoicenbrれていません請求書 SELECT * FROM)

私はが外部ライブラリを使用したくないなど (distinctby) 私は、元のリストに明確な使用しようとしました最初にネストしたグループを使用していますが、それは正しい方法ではないようです。

助けてください

答えて

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; 

ありがとう:D

関連する問題