locked
WCF RIA: Query von mehrern Tables (DataGrid) RRS feed

  • Frage

  • Hallo liebe Community!

    Ich habe ein DataGrid  mit vier Spalten (Norm, Bereich, Gruppe, Frage) und möchte in jede Spalte einen Wert aus einer unterschiedlichen Tabelle in der DB.

    Die Hierarchie sieht folgendermaßen aus:

    Frage

    Gruppe

    Bereich

    Norm

    (Jede Frage gehört zu einer Gruppe, jede Gruppe gehört zu einem Bereich,...)

    Jeder dieser Tables hat eine Spalte "Bezeichnung" und diese Bezeichnungen möchte ich im DataGrid darstellen.

    Mein bisheriger (fehlerhafter) Query:

    return this.ObjectContext.Frage.Include("Gruppe")
                                      .Include("Gruppe.Bereich")
                                           .Include("Gruppe.Bereich.Norm");

    ebenso fehlerhafter Query:

     return (from f in this.ObjectContext.Frage
                        join g in this.ObjectContext.Gruppe on f.GID equals g.GID
                        join b in this.ObjectContext.Bereich on g.UBID equals b.UBID
                        join n in this.ObjectContext.Norm on b.EBID equals n.EBID
                        join ff in this.ObjectContext.FrageFunktion on f.FRID equals ff.FRID
                        join fk in this.ObjectContext.Funktion on ff.FKID equals fk.FKID
                        join pf in this.ObjectContext.PersonFunktion on fk.FKID equals pf.FKID
                        join p in this.ObjectContext.Person on pf.PID equals p.PID
                        where p.PID == PID
                        select f);

    Mein DataGrid sieht folgendermaßen aus:

            <sdk:DataGrid AutoGenerateColumns="False" Grid.Row="1"  Name="dgFragen"  >
                            <sdk:DataGrid.Columns>
                                <sdk:DataGridTextColumn Header="Norm" Binding="{Binding Norm.nBez}"/>
                                <sdk:DataGridTextColumn Header="Bereich" Binding="{Binding Bereich.bBez}"/>
                                <sdk:DataGridTextColumn Header="Gruppe" Binding="{Binding Gruppe.gBez}"/>
                                <sdk:DataGridTextColumn Header="Frage" Binding="{Binding fBez}"/>
                            </sdk:DataGrid.Columns>
                        </sdk:DataGrid>

    Wie bekomme ich die verschiedenen Spalten in ein DataGrid?

    Danke im Voraus,

    MaxM


    Samstag, 18. Mai 2013 16:32

Alle Antworten

  • Hi,
    wenn Du die Expand-Methode nutzt, werden die Kindelemente auch geladen, z.B. so:
     
    frageCollection.LoadAsync(Ctx.Frage.Expand("Gruppe"));
     
    Entsprechend müssten dann auch die Grandchilds geladen werden.
     
    --
    Peter Fleischer
    Montag, 20. Mai 2013 19:23
  • Hallo MaxM,

    Wenn Dir unsere Antworten geholfen haben, dann bitte markiere diese als Antwort.

    Danke und Gruss,

    Ionut

    Dienstag, 21. Mai 2013 15:05
  • Hallo liebe Community! 

    Ich habe eine neue Methode in meinem DomainService hinzugefügt.

    public IQueryable<FragenPersonen> GetFragenPersonenById(Guid PID) 
            {
                return (from f in this.ObjectContext.Frage
                        join g in this.ObjectContext.Gruppe on f.GID equals g.GID
                        join b in this.ObjectContext.Bereich on g.UBID equals b.UBID
                        join n in this.ObjectContext.Norm on b.EBID equals n.EBID
                        join ff in this.ObjectContext.FrageFunktion on f.FRID equals ff.FRID
                        join fk in this.ObjectContext.Funktion on ff.FKID equals fk.FKID
                        join pf in this.ObjectContext.PersonFunktion on fk.FKID equals pf.FKID
                        join p in this.ObjectContext.Person on pf.PID equals p.PID
                        where p.PID == PID
                        select new FragenPersonen() {
                            FRID=f.FRID,
                            nBez=n.nBez,
                            bBez=b.bBez,
                            gBez=g.gBez,
                            fBez=f.fBez
                        });
            }

    Dazu habe ich eine neue Klasse (PersonenFragen) im Web-Projekt erstellt, welche die gemischten Resultate speichert. So sieht die aus:

     public class FragenPersonen
        {
            [Key]
            public Guid FRID { get; set; }
            public string nBez { get; set; }
            public string bBez { get; set; }
            public string gBez { get; set; }
            public string fBez { get; set; }
        }

    Wenn ich diese neue Methode aufrufe, zeigt das DataGrid _nichts_ mehr an.

    Voher wurden zumindest schon die Bezeichnungen der Tabellen "Frage" und "Gruppe" angezeigt.

    @Peter Fleischer: Diesen Ansatz kann ich nicht nachvollziehen. Mein DomainService bietet keine Expand()-Methode.

    Danke im Voraus!!

    Freitag, 24. Mai 2013 18:34
  • Hi,
    ich bin bei meiner Antwort davon ausgegangen, dass Du einen WcfDataService nutzt. Damit reduziert sich die Abfrage auf einen clientseitigen Construct, z.B. so in VB.NET:
     
    ''' <summary>
    ''' Ansicht aller Fragen
    ''' Wenn noch nicht geladen, dann das Laden starten
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property View1 As ICollectionView
      Get
        If Ctx IsNot Nothing AndAlso cvs1.View Is Nothing Then
          col1 = New DataServiceCollection(Of Frage)
          col1.LoadAsync(Ctx.Frage.Expand("Gruppe"))
        End If
        Return cvs1.View
      End Get
    End Property
     
    ''' <summary>
    ''' Laden der Fragen abgeschlossen
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub col1_LoadCompleted(sender As Object, e As LoadCompletedEventArgs) Handles col1.LoadCompleted
      cvs1.Source = From itm1 In col1 _
                    From itm2 In itm1.Gruppe _
                    Select New Helper With {.Frage = itm1.fBez, .Gruppe = itm2.gBez}
      OnPropertyChanged("View1")
    End Sub
     
    --
    Peter Fleischer
    Samstag, 25. Mai 2013 17:46