Announcement

Collapse
No announcement yet.

Join mit Linq -> alle Felder beider Tabellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Join mit Linq -> alle Felder beider Tabellen

    Hallo ich habe eine Linq abfrage gebaut die mir 2 Tabellen verknüpft.

    jetzt will ich aber ein Select * beider Tabellen im Ergebnis haben. Was leider nicht funktioniert. in meinem Grid(xtragrid Devexpress) bekomme ich mit diesem Code leider nur 2 Spalten in denen DB.Kunde und DB.Preisklasse steht

    Code:
    Dim list = (From x In mydb.tblKunde Join h In mydb.tblPreisKlasse On x.fiPreisklasse Equals h.idPreisKlasse Where x.dtAusgeblendet = False)
    hat jemand einen Tipp?

  • #2
    Da keine der beteiligten Klassen der Klasse entspricht die du als Ergebnis haben möchtest mußt du einen neuen anonymen Typen erzeugen. Dazu an deinen LINQ Ausdruck einfach eine Select Klausel anhängen um die anonyme Klasse zu definieren.

    Beispiel aus den 101 Linq Samples der Msdn
    Code:
    Dim pList = From p In System.Diagnostics.Process.GetProcesses() _
                Select ProcessName = p.ProcessName, _
                       Size = (Format(p.WorkingSet64 / 1000, "#,##0") & " KB"), _
                       Size64 = p.WorkingSet64

    Comment


    • #3
      Danke, nur leider hat deine Antwort doch irgendwie nichts mit meiner Frage zu tun, du gibts mit dem Select ja explicit 3 Felder zurück.

      ich will ja alle Felder der beiden verknüpften Tabellen zurückgeben. Ohne diese explicit anzugeben.
      SQL mäßig sowas in der Art:

      select tblkunde.*, tblpreisklasse.*

      Comment


      • #4
        Ich denke das geht schlicht und ergreifend nicht. Du darfst nicht vergessen dass Du hier NICHT auf Tabellen + Spalten arbeitest, sondern auf Objekten.
        Das heisst das Ergebniss ist nicht ein Objekt mit allen Properties die beide gemeinsam haben, sondern ein Tupel das beide Objekte enthält, bei denen die Bedingung aus dem on Block übereinstimmt. Mal ganz abgesehen davon, dass ein Statement ohne select gar nicht gültig ist - was Dir Visual Studio schon sagen sollte.
        Du wirst das Mapping an dieser Stelle wohl immer explizit machen müssen.

        Comment


        • #5
          SQL mäßig sowas in der Art:
          Jedem meiner Kollegen würde ich auf die Finger klopfen wenn er in SQL den * benutzt(Außer er schreibt gerade einen SQLEditor). Und mit LINQ geht es glücklicherweise nur mit expliziter Angabe.
          Was denkst du würde passieren wenn beide Klassen gleichnamige Properties haben?

          Comment


          • #6
            Mal ganz abgesehen davon dass Objekte auf Funktionen haben können was soll mit denen passieren?

            Comment


            • #7
              Anonyme Typen können keine Methoden haben(Sind ja mehr oder weniger nur Dictionaries mit ein wenig Design-time Magie). Die wären also kein Problem.

              Comment


              • #8
                Aber wie soll ein anonymes Objekt aus 2 Properties erstellt werden die intern vielleicht auch wieder Funktionen benutzen. Properties sind ja auch nichts anderes als Funktionen mit etwas Compiler Magie
                Wird aus den anonymen Objekten tatsächlich ein Dictionary kompiliert?

                Comment


                • #9
                  Code:
                  Wird aus den anonymen Objekten tatsächlich ein Dictionary kompiliert?
                  Nö ist voll gelogen. Hab ich schonmal erwähnt das ich nicht vertrauenswürdig bin?

                  Ich hatte scheinbar das falsche Gedankenmodell im Kopf. Ich hab mir einen anonymen Typen ähnlich wie ein dynamic Object vorgestellt. Hab mal für ein simpelst Beispiel
                  Code:
                   new { Feld = "Hallo Welt"};
                  den generierten IL angeschaut.
                  Da kommt tatsächlich eine direkte Ableitung von Object raus mit generierten Getter Properties und ein paar (interessanten) Implementierung für Equals, GetHashcode und ToString().

                  Comment


                  • #10
                    Ok dann geht's also nicht ohne Explizit alle Felder hinschreiben. Dann kann ich's so wohl nicht verwenden. Da an dieser Stelle Datenbankfelder angehangen werden sollen die der User selbst in der DB(natürlich programm gesteuert) anlegt und ich zum Entwurfszeitpunkt ja nicht sagen kann ob welche existieren oder wie sie im Endeffekt heißen ;-)


                    Jedem meiner Kollegen würde ich auf die Finger klopfen wenn er in SQL den * benutzt(Außer er schreibt gerade einen SQLEditor). Und mit LINQ geht es glücklicherweise nur mit expliziter Angabe.
                    Was denkst du würde passieren wenn beide Klassen gleichnamige Properties haben?
                    Ich weiß ja nicht wie man sowas dann handelt wenn man zB. einen Artikelstamm hat. mit knapp 100 Feldern.
                    soll man diese dann immer komplett tippen wenn man einfach auf alle Felder im Grid (informativen) Zugriff braucht.
                    und bei uns ist es der Fall das durch gesetzliche Bestimmungen oder ähnliches der Artikelstamm doch mal wieder 1,2 Felder mehr bekommt.
                    Geh ich dann in meinem Programm alle SQL Statements und Linq abfragen suchen und muss diese Felder nachpflegen?

                    Comment


                    • #11
                      Ich denke ich würde so etwas dann nicht als Tabellenspalte abbilden, sondern in eine andere Struktur bringen.
                      Du könntest z.B. eine Tabelle machen die jeweils eine ArtikelId, EigenschaftName und EigenschaftWert enthält. Das casten der Eigenschaften von String auf einen konkreten Typ müsstest Du dann in der Datenzugriffsschicht vornehmen. Das ganze hat den Vorteil dass die Datenbank immer im gleichen Zustand bleibt und Du keine * select und Gittermagie brauchst

                      Eine Spalte in einem Gitter muss nicht zwangsläufig eine Spalte in einer Tabelle sein.

                      Comment


                      • #12
                        ja so könnte ich es machen, aber verkompliziert das ganze Arbeiten zu meinem vorherigen Access Projekt :-)
                        ich muss mir mal gedanken machen, wenn ich es so machen würde wie du sagst bekomme ich sie im Devexpress Grid wohl nicht mehr gruppiert ...

                        Comment

                        Working...
                        X