Linq - Group Join - Synatax Probleme
- VB.NET
- .NET (FX) 4.5–4.8
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 160 Antworten in diesem Thema. Der letzte Beitrag () ist von StGo.
-
-
StGo aus Post #12 schrieb:
Ja sehe den Fehler. Habe es aber nur falsch übertragen im Code stimmt die Zuordnung.
"Where tB.IDTabelleA = tA.ID And tC.IDTabelleA = tA.ID"
...also mitAnd
schließen sich beide Argumente gegeneinander aus und bringen keine Ergebnisse, mitOr
schon - aber da kann man denWhere
-Abschnitt gleich weglassen.
Ich habe es jetzt so versucht:
VB.NET-Quellcode
- Dim q1 = From a In dts.TabelleA Join b In dts.TabelleB On a.Id Equals b.IdTabelleA
- Select New With {.id = a.Id, .sp1 = a.Spalte2, .sp2 = a.Spalte3, .B = b.bSpalte, .C = ""}
- Dim q2 = From a In dts.TabelleA Join c In dts.TabelleC On a.Id Equals c.IdTabelleA
- Select New With {.id = a.Id, .sp1 = a.Spalte2, .sp2 = a.Spalte3, .B = "", .C = c.cSpalte}
- Dim Result = q1.Concat(q2)
Edit: Das bezieht sich natürlich auf das Datenmaterial von Post #1
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()
-
Ich habe mich mal ein wenig daran gesetzt: warum Join/Group, wenn du die LINQ auch so nutzen kannst?
C#-Quellcode
- var stammRow1 = dataSet1.Stammdaten.AddStammdatenRow("Test", "Test", "Test");
- var stammRow2 = dataSet1.Stammdaten.AddStammdatenRow("Test2", "Test2", "Test");
- var pdfRow1 = dataSet1.PDF.AddPDFRow("Test", stammRow1);
- var pdfRow2 = dataSet1.PDF.AddPDFRow("Test2", stammRow1);
- var pdfRow3 = dataSet1.PDF.AddPDFRow("Test3", stammRow2);
- var xlsRow1 = dataSet1.XLS.AddXLSRow("Test1", "A2", stammRow1);
- var xlsRow2 = dataSet1.XLS.AddXLSRow("Test2", "A2", stammRow2);
- var xlsRow3 = dataSet1.XLS.AddXLSRow("Test3", "B2", stammRow2);
- dataSet1.AcceptChanges();
- dataSet1BindingSource.DataSource = from stammdata in dataSet1.Stammdaten
- from pdf in dataSet1.PDF
- from xls in dataSet1.XLS
- where stammdata.Id == pdf.IdStammdaten && stammdata.Id == xls.IdStammdaten
- select new { Id = stammdata.Id, Bereich = pdf.Bereich, Sheet = xls.Sheet, Zelle = xls.Zelle };
Basierend auf dem Screenshot habe ich auch ein Beispielprojekt aufgebaut, was genau das macht, was du versuchst zu erreichen. (Visual Studio 2012 Express oder neuer erforderlich) -
VB1963 schrieb:
...also mit And schließen sich beide Argumente gegeneinander aus und bringen keine Ergebnisse, mit Or schon - aber da kann man den Where-Abschnitt gleich weglassen.
Ich habe es jetzt so versucht:
Eben nicht. Der FK von TabelleB ist der Primärschlüssel von TabelleA und der FK von TabelleC ist der Primär von TabelleB
Mit dem "AND" verknüpfe ich komplett richtig indem ich sagen
Ich möchte nur ergebnisse WO FK von B = Primär von A (und jetzt pass auf) UND FK von C = Primär von B
klingt logisch oder? -
ich hab jetzt AliveDevils Lösung angeguckt, und die Entsprechung mit Join gecodet:
C#-Quellcode
- public Form1()
- {
- InitializeComponent();
- var stammRow1 = dataSet1.Stammdaten.AddStammdatenRow("Test", "Test", "Test");
- var stammRow2 = dataSet1.Stammdaten.AddStammdatenRow("Test2", "Test2", "Test");
- var pdfRow1 = dataSet1.PDF.AddPDFRow("Test", stammRow1);
- var pdfRow2 = dataSet1.PDF.AddPDFRow("Test2", stammRow1);
- var pdfRow3 = dataSet1.PDF.AddPDFRow("Test3", stammRow2);
- var xlsRow1 = dataSet1.XLS.AddXLSRow("Test1", "A2", stammRow1);
- var xlsRow2 = dataSet1.XLS.AddXLSRow("Test2", "A2", stammRow2);
- var xlsRow3 = dataSet1.XLS.AddXLSRow("Test3", "B2", stammRow2);
- dataSet1.AcceptChanges();
- dataGridView1.AutoGenerateColumns = true;
- var data = from stammdata in dataSet1.Stammdaten
- join pdf in dataSet1.PDF on stammdata.Id equals pdf.IdStammdaten
- join xls in dataSet1.XLS on stammdata.Id equals xls.IdStammdaten
- select new { Id = stammdata.Id, Bereich = pdf.Bereich, Sheet = xls.Sheet, Zelle = xls.Zelle };
- data = from stammdata in dataSet1.Stammdaten
- from pdf in dataSet1.PDF
- from xls in dataSet1.XLS
- where stammdata.Id == pdf.IdStammdaten && stammdata.Id == xls.IdStammdaten
- select new { Id = stammdata.Id, Bereich = pdf.Bereich, Sheet = xls.Sheet, Zelle = xls.Zelle };
- dataSet1BindingSource.DataSource = data.ToList();
- }
Wenn zeile#26 so bleibt greift AliveDevils Lösung, verschiebt man #26 auf #19, so greift die joining-Lösung.
-
-
Morgen zusammen,
danke für die zahlreiche Hilfe. Bei meinen Lösungsversuchen waren ähnlich Lösungen dabei. Ein Fehler den ich gemacht habe ist die neue Tabelle nicht richtig anzulegen. Ich dachte, dass die Spaltenbezeichnungen aus den original Tabllen übernommen werden.
Habe Code von AliveDevil ausprobiert und den von EDR. Beide erzeugen eine neue Tabelle allerdings ohne Inhalt. Wo der verloren geht werde ich noch herausfinden.
Falls jemand das "Ergebnis" in vb sehen möchte:
VB.NET-Quellcode
- Public Class mrfTest1
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Dim dsStammdaten As New DataSetStammdatenDB
- Dim taStammdaten As New DataSetStammdatenDBTableAdapters.StammdatenTableAdapter
- Dim taXls As New DataSetStammdatenDBTableAdapters.XLSTableAdapter
- Dim taPdf As New DataSetStammdatenDBTableAdapters.PDFTableAdapter
- taStammdaten.Fill(dsStammdaten.Stammdaten)
- taXls.Fill(dsStammdaten.XLS)
- taPdf.Fill(dsStammdaten.PDF)
- Dim q = From s In dsStammdaten.Stammdaten _
- Join p In dsStammdaten.PDF On s.Id Equals p.IdStammdaten _
- Join x In dsStammdaten.XLS On s.Id Equals x.IdStammdaten _
- Select New With {.Id = s.Id, .Eingabepfad = s.Eingabepfad, .Ausgabepfad = s.Ausgabepfad, .Sheet = x.Sheet, .Zelle = x.Zelle, .Bereich = p.Bereich}
- Dim q1 = From s In dsStammdaten.Stammdaten _
- From p In dsStammdaten.PDF _
- From x In dsStammdaten.XLS _
- Where s.Id = p.IdStammdaten And s.Id = x.IdStammdaten _
- Select New With {.Id = s.Id, .Eingabepfad = s.Eingabepfad, .Ausgabepfad = s.Ausgabepfad, .Sheet = x.Sheet, .Zelle = x.Zelle, .Bereich = p.Bereich}
- Me.DataGridView1.DataSource = q1.ToList
- End Sub
- End Class
Ich hänge das Projekt mal dran. Der aktuelle Code findet sich in TypisiertesDataSetTest1. Ich spiele in dem Projekt etwas mit den verschieden Ansichten.
Dim q1 = From a In dts.TabelleA Join b In dts.TabelleB On a.Id Equals b.IdTabelleA
Select New With {.id = a.Id, .sp1 = a.Spalte2, .sp2 = a.Spalte3, .B = b.bSpalte, .C = ""}
Dim q2 = From a In dts.TabelleA Join c In dts.TabelleC On a.Id Equals c.IdTabelleA
Select New With {.id = a.Id, .sp1 = a.Spalte2, .sp2 = a.Spalte3, .B = "", .C = c.cSpalte}
Dim Result = q1.Concat(q2)
Das habe ich auch schon probiert. Leider mit dem gleichen Ergebnis das nichts dabei raus kam. Habe auch probiert mit Union die beiden Kindtabellen zu verbinden und dann zu joinen. War leider auch nichts.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „StGo“ ()
-
VB1963 schrieb:
shaebich schrieb:
klingt logisch oder?
Also bei mir hat es ohne Probleme funktioniert. Man muss natürlich auch das DataSet so aufbauen. Der Code war natürlich nicht allgemein, er sollte nur als idee fungieren. Man kann einen Join ohne Probleme mit der WHERE Klausel nachbauen. -
Auf Grundlage des Datenmaterials von Post #1TabelleA:
Id | spalte2 | spalte3
1 | test | test
2 | test2 | test2
TablleB:
Id | IdTabelleA |bSpalte
1 | 1 | testB
TabelleC:
Id | IdTabelleA | cSpalte
1 | 2 | testC
Ergebnis sollte sein:
Id (aus TabelleA) | spalte2 | spalte3 | bSpalte | cSpalte
1 | test | test |testB | -
2 | test2 | test2 | - | testC
-
-
-
-
shaebich schrieb:
Man kann einen Join ohne Probleme mit der WHERE Klausel nachbauen.
Glaub ich zumindest - Benchmarks hab ich noch nicht gemacht. Aber wäre auch von daher logisch, dass man sich sonst fragen müsste, wozu Join überhaupt nötig ist.
-
StGo schrieb:
Aber trotzdem bekomme ich keine Ausgabe. Ich vermute eher das ich was in Richtung bindingSource machen muss. Da lese ich noch dran.
Erst einmal liegt es daran, dass du dein DataSet komplett Falsch befüllst...
Kp was du da im FormLoad versuchst zu tun, aber so funktioniert es nicht.
Du benötigst lediglich 3 Zeilen und die sind:
Dannach ist dein DataSet voll...
Was du da allerding versuchst anzuzeigen, kann ich dir nicht genau sagen, ob dies funktioniert, da deine Tabelle unterschiedlich sind und ich soetwas noch nie mit linq realisieren musste. -
na, die 3 Zeilen hat er doch. Nur nimmt er unsinnigerweise nicht die TableAdapter, die der FormDesigner generiert hat, sondern er instanziert neue (und disposed die nicht wieder).
Aber funzen oder nicht funzen tut das ebenso wie deine 3 Zeilen
AliveDevil sei dank haben wir eine brauchbare Sample-Solution, auf der man reproduzierbare Experimente entwickeln kann
Aussagen zu allem anneren sind imo eher Spekulation.
-
StGo schrieb:
Wo der verloren geht werde ich noch herausfinden.
ErfinderDesRades schrieb:
na, die 3 Zeilen hat er doch. Nur nimmt er unsinnigerweise nicht die TableAdapter, die der FormDesigner generiert hat, sondern er instanziert neue (und disposed die nicht wieder).
Aber funzen oder nicht funzen tut das ebenso wie dein Code-Vorschlag.
Also bei mir bleibt jegliche Anzeige leer so wie es im FormLoad ist -
Ich hatte die vom ForumDesigner produzierten TableAdapter im laufe des Testens gelöscht. Inzwischen sind sie wieder an Ort und Stelle und die anderen sind gelöscht.
ich hänge gerne das Projekt nochmal an.
Also bei mir bleibt jegliche Anzeige leer so wie es im FormLoad ist
Wenn du den Kommentar von diesem Codeabschnitt nimmst bekommst du die Stammdaten mit XLS gejoint und angezeigt auch mit den "falschen" TableAdaptern:
Danke
-
noch einmal: Zu stgo's Anwendung kann gar keine Aussage gemacht werden, die hat ja nur Stgo.
Zu AliveDevils Anwendung können Aussagen gemacht werden, die kannst du ja downloaden. -
-
ups - übersehen!
aber nützt nix - bei mir failt schon die Connection. Erstmal eh, denn LocalDb kennt mein System nicht als DB-Server, aber auch bei angepasst auf mein System erhalte ich:
Fehler schrieb:
Fehler beim Anfügen einer automatisch benannten Datenbank für die Datei C:\Users\Account1\Downloads\TypisiertesDataSet\TypisiertesDataSet2\TypisiertesDataSetTest1\bin\Debug\StammdatenDB.mdf. Eine Datenbank mit diesem Namen ist bereits vorhanden, die angegebene Datei kann nicht geöffnet werden, oder sie befindet sich in der UNC-Freigabe.
-
Benutzer online 1
1 Besucher
-
Tags
-
Ähnliche Themen
-
StGo - - Daten(bank)programmierung
-
4 Benutzer haben hier geschrieben
- Gast (89)
- ErfinderDesRades (39)
- shaebich (26)
- VB1963 (7)