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
ogFakturaLinje
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}");
}
}
}
}