首页 > 解决方案 > 如何加入 groupby generic

问题描述

我在这里有一个关于如何使下面的连接更通用的问题,我们可以在这里看到如果我有 3 张发票,我必须再添加 3 个连接,

你想让这个连接尽可能通用吗?

(from line in associationRecord
                      join invoice1 in headers on line.InvoiceNumber equals invoice1.DocumentNumber
                      join item1 in items on invoice1.DocumentNumber equals item1.InvoiceNumber into h1Items
                      join impDeclaration1 in importDeclarations on invoice1.DocumentNumber equals impDeclaration1.InvoiceNumber into g1
                      from imp1 in g1.DefaultIfEmpty()
                      join invoice2 in headers on line.AssociatedInvoiceNumber equals invoice2.DocumentNumber
                      join item2 in items on invoice2.DocumentNumber equals item2.InvoiceNumber into h2Items
                      join impDeclaration2 in importDeclarations on invoice2.DocumentNumber equals impDeclaration2.InvoiceNumber into g2
                      from imp2 in g2.DefaultIfEmpty()
                      select new { invoice1, invoice2, h1Items, h2Items, imp1, imp2 }).ToList();

班级

internal sealed class AssociatedInvoiceRecord 
{
   public string? AssociatedInvoiceNumber { get; set; }
   public string? InvoiceNumber { get; set; }
}

internal sealed class InvoiceHeaderRecord
{
   public string? DocumentNumber { get; set; }
}

internal sealed class InvoiceImportDeclarationRecord
{
   public string? InvoiceNumber { get; set; }
}

internal sealed class InvoiceItemRecord
{
   public string? InvoiceNumber { get; set; }
}

标签: c#linqgroup-by

解决方案


您可以使用“或”来合并冗余,但您会丢失发票数据来自发票 1 或发票 2 的上下文。

(from line in associationRecord
 join invoice in headers on line.InvoiceNumber equals invoice1.DocumentNumber || line.AssociatedInvoiceNumber equals invoice.DocumentNumber
 join item in items on invoice.DocumentNumber equals item.InvoiceNumber into hItems
 join impDeclaration in importDeclarations on invoice.DocumentNumber equals impDeclaration.InvoiceNumberinto g
 from imp in g.DefaultIfEmpty()
 select new { invoice, hItems, imp }).ToList();

推荐阅读