How to join with groupby generic

Viewed 57

I have a question here on how to make this join below more generic, as we can see here if I have 3 invoices I have to add 3 more joins,

Would you like to make this join as generic as possible?

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

class

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

1 Answers

You could use an 'or' to consolidate the redundancies, but you'd lose the context of which invoice data was from invoice1 or invoice2.

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