Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Linq Abfrageergebnisse zusammenführen


bitbyte - Do 09.07.15 20:28
Titel: Linq Abfrageergebnisse zusammenführen
Hallo an alle,

ich habe ein Problem bei dem ich irgendwie keine vernünftige Lösung finde:
Also ich habe eine vorgegebene Datenbank, daraus frage ich mit Linq die benötigten Daten ab. Das ist auch kein Problem! Leider befinden sich die gewünschten Daten in 2 verschiedenen Tabellen.

Beispiel:
Tabelle A enthält alle Werte in Zeilen! (Wert1, Wert2, Wert2, usw.)
Tabelle B enthält alle Werte in Spalten!
Wert1
Wert2
Wert3
usw.


Nun soll ich die Daten des Abfrageergebnise (Tabelle A) zu den Daten aus Tabelle B einsortieren!

Aber wie? Im Moment habe ich eine Lösung mit einer Zwischenklasse die ich mit einer foreach-Schleife mit den Daten aus Tabelle B befülle! (Keine Problem!) Aber die Daten aus Tabelle A kann ich im Moment nur in eine Liste überführen und dann wieder mit einer foreach-Schleife die Daten der Zwischenklasse einfügen!
Mein bisheriger Code:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
List<decimal> TestListe = new List<decimal>();
            foreach (var item in anlagen)
            {
                TestListe.Add(Convert.ToDecimal(item.Wert_1));
                TestListe.Add(Convert.ToDecimal(item.Wert_2));
                TestListe.Add(Convert.ToDecimal(item.Wert_3));
                TestListe.Add(Convert.ToDecimal(item.Wert_4));
                TestListe.Add(Convert.ToDecimal(item.Wert_5));
            }
            var ct = 0;
            foreach (var a in TestListe)
            {
                itemList[ct].Wert = Convert.ToDecimal(TestListe[ct]);
                ct += 1;
            }

Das läuft zwar aber gibt hier keine bessere Lösung?

Bin für jede Hilfe dankbar!!
Viele Grüsse!


Palladin007 - Do 09.07.15 21:14

Ich versteh die Ausgangslage nicht so wirklich, besonders da die Tatsache, dass Daten in zwei verschiedenen Tabellen in einer Pivot-Form vorhanden sind, irgendwie weh tut :D

Eveentuell hilft dir aber der Tipp SelectMany weiter. Das ist auch eine Linq-Funktion, die es erlaubt durch eine Auflistung von Auflistungen zu laufen und sie zusammen zu fassen.

Du müsstest es dann ungeähr so machen:


C#-Quelltext
1:
IEnumerable<object> newData = data.SelectMany(x => new object[] { x.Wert_1, x.Wert_2, x.Wert_3, x.Wert_4, x.Wert_5 });                    


Alternativ kannst Du dir natürlich auch die Pivot-Darstellung deiner Daten erstellen, aber dafür gibt es meines WIssens nach keine fertigen Methoden. Ohne eine weitere Klasse wirst Du da auch nicht weiter kommen, außer Du nutzt anonyme Typen und das würde ich gerade bei komplexeren Daten eher vermeiden.


bitbyte - Do 09.07.15 21:49

Hallo Palladin007,

danke für Deine Antwort! Die Bezeichnung Pivot-Form trifft es sehr gut!
Nun ich soll aus den beiden Tabellen ein Grid füllen und anzeigen, in dem alle diese Daten richtig zugeordnet/angezeigt sind!(Es können noch viel mehr Daten oder Views werden) Deswegen die Frage!

Das mit SelectMany muss ich erst ausprobieren bzw. mich erst einlesen, was die Funktion genau macht und wie!

Ich hätte gerne eine einfache Funktion oder einen Lösungsweg mit dem ich solche Probleme möglichst skalierbar lösen kann!

Lg
bitbyte


jfheins - Do 09.07.15 22:27

Das SelectMany macht dir im Grunde aus Enumerable<Enumerable<int>> ein "planares" Enumerable<int>.

So sähe deine Query ungefähr in LINQ aus:

C#-Quelltext
1:
2:
      var testListe = anlagen.SelectMany(x => new[] { x.Wert_1, x.Wert_2, x.Wert_3, x.Wert_4, x.Wert_5 }).Select(x => Convert.ToDecimal((x)));
      var itemList = testListe.Select(d => new CoolItem {Wert = d});


Ob das noch verstehbar ist, wenn man es liest? Naja...