c#linq按实体值将

时间:2016-04-24 18:06:53

标签: lambda group-by

我遇到了需要编写的部分代码。 我有一个xml文件,我必须导入和返工,以便我可以在datagridview中显示我需要的东西。它全部基于发票类:

    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。

我需要过滤掉那些数据。

e.g。信用证有两个条目。 一个是InvoiceNbr 20160420-1,金额为50美元,另一个 使用相同的InvoiceNbr,金额为-50 $。

printSeq for + 50 $ invoice是1。 printSeq for -50 $ invoice是2。

我尝试过滤

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

但在这种情况下,一个条目保留在输出中。

如果我使用

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

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

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

(从发票中选择* 其中originallist.invoicenbr不是filterlist.invoicenbr)

想要使用外部库等。 (distinctby) 我试图首先使用嵌套groupby在原始列表中使用distinct,但这似乎不是正确的方法。

请帮忙

1 个答案:

答案 0 :(得分: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