Announcement

Collapse
No announcement yet.

Linq2SQL Verschachtelt rekursiv

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

  • Linq2SQL Verschachtelt rekursiv

    Hallo, ich hab folgendes Problem:
    Ich weiße eine Tabelle über Linq an eine Komponente eines Drittanbieters zu.
    Leider verschachtelt diese Komponente mein Linq Query bis zum Sankt Nimmerleinstag.
    Mit dem Support des Anbieters habe ich mich schon kurz geschlossen. Die schieben es auf Linq, aber ich kann nicht sagen was ich da falsch mache.

    Zur besseren Erläuterung habe ich hier http://profilbilder.de/devexpress.swf ein kleines Video.
    Man sieht wie ich den Datencontext fülle, wie ich die 2 Tabellen verknüpfe und was am Ende beim Start dabei raus kommt.

    Vielleicht hat noch jemand einen Rat.

    Danke

  • #2
    Gibt es dazu einen öffentlichen Case bei DevExpress denn ich mir ansehen könnte?

    Was ich gesehen habe erscheint mir eigentlich auch irgendwie richtig wenn sich die beiden Tabellen gegenseitig referenzieren. Tun die das? Im Reportdesigner Fenster werden ja nur die Metadaten angezeigt und wenn man da durch die Metadaten der referenzierten Tabellen navigiert kann man sich da ewig im Kreis drehen.

    Wenn dich die referenzierten Objekte nicht interessieren und du die Daten nur zum Reporting brauchst (also ReadOnly) könntest du dein LINQ Query so umbauen das sie kein tblRchKopf Objekt zurückliefern sondern einfach einen anderen anonymen Typ mit den Daten von tblRchKopf ohne referenzierte anderen Objekte. Aka

    Code:
    from d in mydb.tblRchKopf
    select new { idRechnung = d.idRechnung,
                      ..... }

    Comment


    • #3
      Der Case bei Devexpress wurde leider privat gemacht von einem anderen Mitarbeiter von uns.
      Im Endeffekt haben die ein Video gemacht wo sie die Vorgehensweise bestätigen und es mit Linq in verbindung setzen.

      Das sich die beiden Tabellen gegenseitig referenzieren ist seltsam, weil es ist eine 1:n Beziehung.

      Der Weg über den Anonymen Typ würde funktionieren. Allerdings für die Stelle wo ich den Report verwenden will (zB: ein Gridview mit Rechnungsköpfen das über eine Detailview Positionen und Kunde zeigt...), würde das bedeuten das ich das Query neu aufbauen müsste. Was wiederum heißt Felder tippen bis man schwarz wird. Dann könnte man auch den Umweg über ADO gehen, aber ich müsste meine vorher im Grid gesuchten Daten auch wieder neu zusammen suchen.

      Comment


      • #4
        Das sich die beiden Tabellen gegenseitig referenzieren ist seltsam, weil es ist eine 1:n Beziehung.
        Ob da eine Referenz in beide Richtung generiert wird müßtest du doch im generierten Model Sourcecode nachsehen können. Wenn es keine Referenz in die Gegenrichtung gibt würde ich das dann auch eher für einen Bug im Reportdesigner halten als in LINQ.

        Comment


        • #5
          Ob da eine Referenz in beide Richtung generiert wird müßtest du doch im generierten Model Sourcecode nachsehen können.
          dort versteh ich nur irgendwie überhaupt nichts
          könnte es damit was zu tun haben ?
          Das finde ich wenn ich mir den RechnungsKopf anschaue
          Code:
          <Global.System.Data.Linq.Mapping.AssociationAttribute(Name:="tblKunde_tblRchKopf", Storage:="_tblKunde", ThisKey:="fiKunde", OtherKey:="idKunde", IsForeignKey:=true, DeleteRule:="CASCADE")>  _
          	Public Property tblKunde() As tblKunde
          		Get
          			Return Me._tblKunde.Entity
          		End Get
          		Set
          			Dim previousValue As tblKunde = Me._tblKunde.Entity
          			If ((Object.Equals(previousValue, value) = false)  _
          						OrElse (Me._tblKunde.HasLoadedOrAssignedValue = false)) Then
          				Me.SendPropertyChanging
          				If ((previousValue Is Nothing)  _
          							= false) Then
          					Me._tblKunde.Entity = Nothing
          					previousValue.tblRchKopf.Remove(Me)
          				End If
          				Me._tblKunde.Entity = value
          				If ((value Is Nothing)  _
          							= false) Then
          					value.tblRchKopf.Add(Me)
          					Me._fiKunde = value.idKunde
          				Else
          					Me._fiKunde = CType(Nothing, Nullable(Of Integer))
          				End If
          				Me.SendPropertyChanged("tblKunde")
          			End If
          		End Set
          	End Property
          Ich denke das bewirkt ja,dass wenn man über den Rechnungskopf den Zugriff auf den Kunden hat oder ?
          tbkRchkopf.tblkunde.IrgendeinKundenFeld

          Comment


          • #6
            Ich denke das bewirkt ja,dass wenn man über den Rechnungskopf den Zugriff auf den Kunden hat oder ?
            tbkRchkopf.tblkunde.IrgendeinKundenFeld
            Ja das ist eine normalen Navigational Property. Vermutlich hast du eine entsprechende Property auch in der Kunde Tabelle die auf eine Liste von RchKopf Objekten verweist. Also in einer Richtung hast du die Kunde zur RchKopf Property und in der anderen Richtung die Liste von RchKopf Objekten zum Kunden Property. Typisches Muster bei 1:N Beziehungen. Da hat dann DevExpress Recht das liegt in der Natur von EntityFramework bzw. Linq2SQL das man wenn man eine reine Metadaten Betrachtung des Models macht wie es im Reportdesigner passiert man endlos rekursiv durch diese Struktur hin und her wandern kann. Wenn das wirklich stört kannst du vielleicht die Modelgenerierung so steuern das diese Properties nicht generiert wird. Da fehlt mir aber die konkrete Erfahrung wie man die entsprechend Tools wie EDMGen und Konsorten passend verwendet. Andererseits hättest du die Properties in einem anderem Context vielleicht auch gern und sie würden dann fehlen. Ich glaube ich würde das Verhalten des Reportdesigners einfach so akzeptieren

            Comment


            • #7
              Ok danke!
              Dann müssen wir uns überlegen die Reports eventuell nicht vom Kunden änderbar zu lassen und die Dinger für die paar Listen fest rauszugeben. Wer weiß was passiert wenn die Felder aus der 15 Rekursion auf das Formular ziehen. Schade

              Comment

              Working...
              X