Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#5

AW: Array füllen mit Daten aus Datenbank (Join)

  Alt 12. Nov 2016, 17:49
Also, wenn ich dem Tag das C# korrekt entnehme, dann würde ich folgendes machen. Das ganze kannst Du 1:1 in LinqPad als C# Program reinwerfen und ausprobieren:

Code:
class Kopfdatum
{
   public int Id { get; set; }
   public DateTime Date { get; set; }
}

class Prozessdatum
{
   public int KopfId { get; set; }
   public string Name { get; set; }
   public double Value { get; set; }
}

class Data
{
   public string Name { get; set; }
   public double Value { get; set; }
}

void Main() {
   Kopfdatum[] Kopfdaten = {
      new Kopfdatum() { Id = 1, Date = new DateTime(2016, 11, 12) },
      new Kopfdatum() { Id = 2, Date = new DateTime(2016 ,11, 13) },
   };

   Prozessdatum[] Prozessdaten = {
      new Prozessdatum() { KopfId = 1, Name = "Kraft", Value = 10 },
      new Prozessdatum() { KopfId = 1, Name = "Druck", Value = 2 },
      new Prozessdatum() { KopfId = 1, Name = "Temp", Value = 22 },
      new Prozessdatum() { KopfId = 2, Name = "Geschwindigkeit", Value = 110 },
   };
      
   // Das hier ergibt das, was Du nach einem Join hast:
   var zwischenErgebnis = Prozessdaten
       .Join(Kopfdaten,
         p => p.KopfId,
         k => k.Id,
         (p, k) => new { KopfId = k.Id, KopfDatum = k.Date, ProzessName = p.Name, ProzessWert = p.Value }
      );

   // wenn in LinqPad ausgeführ macht das hier ne Zwischenausgabe :)
    zwischenErgebnis.Dump();
   
   var result = zwischenErgebnis
      .GroupBy(z => z.KopfId)
      .ToDictionary( // hier kommen die Gruppen rein
        group => group.Key,
        group => group.Select(
              i => new Data() { Name = i.ProzessName, Value = i.ProzessWert }
           ).ToList()
      );
      
      
   result.Dump();

   // oder, in einem Rutsch:
   result = Prozessdaten
     .Join(Kopfdaten,
         p => p.KopfId,
        k => k.Id,
        (p, k) => new { Id = k.Id, Val = new Data() { Name = p.Name, Value = p.Value } })
     .GroupBy(j => j.Id)
     .ToDictionary(
         g => g.Key,
        g => g.Select(v => v.Val).ToList()
      );
    
     result.Dump();
}
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat