Gå til indholdet

N293 LINQ (SelectMany og Join med Fakturaer)

Start med at skabe en tom konsol applikation. Definer to record typer: Faktura og FakturaLinje. En Faktura skal indeholde et FakturaId og en Dato, mens en FakturaLinje skal indeholde et FakturaId, en Beskrivelse af varen, og en Pris. Tilføj derefter nogle eksempel data i Main:

record Faktura(int FakturaId, DateTime Dato);
record FakturaLinje(int FakturaId, string Beskrivelse, decimal Pris);

var fakturaer = new List<Faktura>
{
    new Faktura(1, new DateTime(2023, 1, 1)),
    new Faktura(2, new DateTime(2023, 1, 2)),
    new Faktura(3, new DateTime(2023, 1, 3)),
};

var fakturaLinjer = new List<FakturaLinje>
{
    new FakturaLinje(1, "Vare A", 100.0m),
    new FakturaLinje(1, "Vare B", 150.0m),
    new FakturaLinje(2, "Vare C", 200.0m),
    new FakturaLinje(3, "Vare D", 250.0m),
    new FakturaLinje(3, "Vare E", 300.0m),
};

Brug nu LINQ til følgende opgaver:

  • Kombiner Faktura og FakturaLinje baseret på FakturaId og udskriv hver faktura med dens linjer.
  • Find og udskriv samlet pris for hver faktura.
  • Grupperer fakturalinjer efter FakturaId og udskriv hver gruppe med total pris.
Klik for at se et forslag til en løsning
using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
    record Faktura(int FakturaId, DateTime Dato);
    record FakturaLinje(int FakturaId, string Beskrivelse, decimal Pris);

    class Program
    {
        static void Main(string[] args)
        {
            var fakturaer = new List<Faktura>
            {
                new Faktura(1, new DateTime(2023, 1, 1)),
                new Faktura(2, new DateTime(2023, 1, 2)),
                new Faktura(3, new DateTime(2023, 1, 3)),
            };

            var fakturaLinjer = new List<FakturaLinje>
            {
                new FakturaLinje(1, "Vare A", 100.0m),
                new FakturaLinje(1, "Vare B", 150.0m),
                new FakturaLinje(2, "Vare C", 200.0m),
                new FakturaLinje(3, "Vare D", 250.0m),
                new FakturaLinje(3, "Vare E", 300.0m),
            };

            // Kombiner Faktura og FakturaLinje baseret på FakturaId og udskriv
            var fakturaDetaljer = fakturaer.Join(
                fakturaLinjer,
                faktura => faktura.FakturaId,
                linje => linje.FakturaId,
                (faktura, linje) => new { faktura.FakturaId, faktura.Dato, linje.Beskrivelse, linje.Pris }
            );

            foreach (var detalje in fakturaDetaljer)
            {
                Console.WriteLine($"FakturaId: {detalje.FakturaId}, Dato: {detalje.Dato}, Vare: {detalje.Beskrivelse}, Pris: {detalje.Pris}");
            }

            // Find og udskriv samlet pris for hver faktura
            var samletPrisPerFaktura = fakturaer.GroupJoin(
                fakturaLinjer,
                faktura => faktura.FakturaId,
                linje => linje.FakturaId,
                (faktura, linjer) => new { FakturaId = faktura.FakturaId, TotalPris = linjer.Sum(l => l.Pris) }
            );

            foreach (var faktura in samletPrisPerFaktura)
            {
                Console.WriteLine($"FakturaId: {faktura.FakturaId}, Samlet pris: {faktura.TotalPris}");
            }

            // Grupper fakturalinjer efter FakturaId og udskriv hver gruppe med total pris
            var gruppePris = fakturaLinjer
                .GroupBy(l => l.FakturaId)
                .Select(g => new { FakturaId = g.Key, TotalPris = g.Sum(l => l.Pris) });

            foreach (var gruppe in gruppePris)
            {
                Console.WriteLine($"FakturaId: {gruppe.FakturaId}, Total pris for gruppen: {gruppe.TotalPris}");
            }
        }
    }
}