2016-04-24 93 views
0

我被捆绑在需要编写的部分代码上。 我得到了一个xml文件,我必须导入并重写,以便我可以在datagridview中显示我需要的内容。这完全是基于一类发票:c#linq分割列表按实体值分为两部分

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

内的importfile有对invoicenbr多个条目。 (每个发票行一个) 所以我做了一个分组和以下声明。

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中看起来不错。现在有一些行,例如对于发票号码出现两次或更多次的信用(或部分出货)。在这种情况下,PrintSeq> 1。

我需要过滤掉这些数据。

例如对于一个信贷有两个条目。 One with InvoiceNbr 20160420-1 with a amount of 50 $ and other with the InvoiceNbr with-amount -50 $。

的printSeq为+ 50 $的发票是1 的printSeq为-50 $发票是2

我试着用

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

过滤,但在这种情况下,一个项目停留在输出。

如果我使用

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

我得到一个列表,它显示了,我不想在输出中显示InvoiceNbrs。

因此,我现在正在搜索使用该列表的可能性,以便用Lambda表达式过滤掉原始输出上的所有invoiceNbrs。

要使用外部库等 (distinctby) 我试图通过原始列表上使用不同的(选择发票 其中originallist.invoicenbr IS NOT filterlist.invoicenbr *)首先使用嵌套组,但似乎不是正确的方法。

请帮

回答

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