Announcement

Collapse
No announcement yet.

Erhalte nicht alle Werte der Abfrage zurück

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

  • Erhalte nicht alle Werte der Abfrage zurück

    Guten Morgen,
    eben habe ich ein komisches Problem entdeckt, welches ich bisher noch nie hatte.
    Meine Linq Abfrage liefert mir die Id nicht zurück, d.h. bei der Ausgabe der Daten steht immer 0, obwohl in der DB Werte vorhanden sind. Die restlichen Daten werden korrekt zurück geliefert.

    Code:
    // Die Abfrage. 
    // Eigentlich gibt es noch mehr Datenfelder, aber ich habe in der Abfrage mal die ganzen joins weg gelassen, trotzdem wird immer Id = 0 zurück geliefert.
     public static List<Zuordnung> GetTest()
            {
                try
                {
                    using (entities1 ctx = new entities1())
                    {
                        
                        var qry = (from z in ctx.ek_zuordnung
                                   orderby z.nummerBe
                                   select new Zuordnung
                                   {
                                       Id = z.id,
                                       NummerLS = z.nummerLs,
                                       NummerBE = z.nummerBe,
                                       AdresseId = z.adressnummer
    
                                   }).ToList();
                        return qry;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.InnerException.Message, "Datenbankfehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return null;
                }
            }
    //------------------------
    
    // Meine Klasse mit den Properties.
     public class Zuordnung : INotifyPropertyChanged, IDataErrorInfo
        {
            private Int64 _id = 0;
            private String _nummerBe = "";
            private String _bezeichnungBe = "";
            private String _nummerLs = "";
            private String _bezeichnungLs = "";
    
    
      public Int64 Id
            {
                get { return _id; }
                set
                {
                    value = _id;
                }
            }
    
    // ...
    
    
    // Ganz einfach die Datenbindung.
    dataGridView1.DataSource = GetTest();

    Hat jemand eine Idee an was es liegen könnte, dass die Id keine Werte zurück liefert?

  • #2
    Versuch mal die Query ohne die Zuordnung Klasse auszuführen. Also erstmal in eine anonyme Klasse. Je nachdem ob da das passende ankommt oder nicht wissen wir dann zumindest ob das Problem eher in der Abfrage oder deiner Modelklasse liegt.

    Comment


    • #3
      Ich habe meine Property Id in der Klasse nun wie folgt geändert:
      Code:
      pubic Int64 Id { get; set; }
      und nun funktioniert es ... komisch

      Jetzt ist mir bei meiner Abfrage allerdings noch ein Problem aufgefallen:
      Über den join verbinde ich mit der Tabelle artikel. Nun möchte ich gerne, dass bei beiden Nummer aus meiner Zuordnugnstabelle die richtige Bezeichnung zur Nummer angezeigt wird. Allerdings stehe nun immer die Bezeichnung der nummerBE drin, vermutlich, da ich mit dieser verknüpfe.
      Wie kann ich dann die richtige Bezeichnung auch für die NummerLS abrufen?

      Code:
      var qry = (from z in ctx.ek_zuordnung
                    join a in ctx.artikel on z.nummerBe
                    equals a.nummer
                    orderby z.nummerBe
                    select new Zuordnung
                                     {
                                         Id = z.id,
                                         NummerLS = z.nummerLs,
                                         BezeichnungLS = a.Bezeichnung,
                                         NummerBE = z.nummerBe,
                                         BezeichnungBE = a.Bezeichnung,
                                         AdresseId = z.adressnummer
      
                                     }).ToList();

      Comment


      • #4
        Originally posted by OctoberSwimmer View Post
        Ich habe meine Property Id in der Klasse nun wie folgt geändert:
        Code:
        pubic Int64 Id { get; set; }
        und nun funktioniert es ... komisch
        Dein zuerst gezeigter Code was vermutlich ja auch nicht der Richtige? Im gezeigten was keine Implementierung für INotifyPropertyChanged in der Property. Übrigens genausowenig wie jetzt in der automatischen Property


        Originally posted by OctoberSwimmer View Post
        Wie kann ich dann die richtige Bezeichnung auch für die NummerLS abrufen?
        Zum Verständnis NummerLS bezieht sich auf einen anderen Datensatz in der artikel Tabelle als NummerBE? Die Frage geht also darum das du artikel ein 2.tes mal joinen willst/musst?

        Comment


        • #5
          Originally posted by Ralf Jansen View Post
          Dein zuerst gezeigter Code was vermutlich ja auch nicht der Richtige? Im gezeigten was keine Implementierung für INotifyPropertyChanged in der Property. Übrigens genausowenig wie jetzt in der automatischen Property
          Doch, das ist der richtige Code ... aber muss ich für jede Property meine NotifyPropertyChanged Methode angeben??

          Inhalt der Tabelle ek_zuordnung:
          id,
          nummerBe,
          nummerLs,
          adressnummer

          Datensätze:
          1 1234 5678 88
          2 3434 4534 88

          Nun soll eben aus der Tabelle artikel zu jeder nummerBe und nummerLs die richtige Bezeichnung zugeordnet werden.
          Im Prinzip muss ich dann wahrscheinlich einen 2. join machen, oder?
          Ich würde sogar selbst versuchen nach der Lösung zu suchen, aber ich weiß nicht, mit welchen Stichworten ich suchen muss?!



          Zum Verständnis NummerLS bezieht sich auf einen anderen Datensatz in der artikel Tabelle als NummerBE? Die Frage geht also darum das du artikel ein 2.tes mal joinen willst/musst?[/QUOTE]

          Comment


          • #6
            Doch, das ist der richtige Code ... aber muss ich für jede Property meine NotifyPropertyChanged Methode angeben??
            Ja.

            Ich würde sogar selbst versuchen nach der Lösung zu suchen, aber ich weiß nicht, mit welchen Stichworten ich suchen muss?!
            Nee. Da must du nix suchen. Die Lösung ist so offensichtlich und simpel das du das vielleicht gerade übersiehst. Einfach das gleiche beim 2.ten join machen wie beim ersten

            [HIGHLIGHT=C#]var qry = (from z in ctx.ek_zuordnung
            join be in ctx.artikel on z.nummerBe equals be.nummer
            join ls in ctx.artikel on z.nummerLs equals ls.nummer
            orderby z.nummerBe
            select new Zuordnung
            {
            Id = z.id,
            NummerLS = z.nummerLs,
            BezeichnungLS = ls.Bezeichnung,
            NummerBE = z.nummerBe,
            BezeichnungBE = be.Bezeichnung,
            AdresseId = z.adressnummer
            }).ToList();[/HIGHLIGHT]

            Comment


            • #7
              Danke für den Code - leider funktioniert es immer noch nicht. :-(
              Weiterhin kommt nur die BezeichnungBe zu beiden Nummern. Ich versteh das nicht.

              Nochmals zu INotifyPropertyChanged: Ich habe erst jetzt angefangen, mich mit DataBinding zu beschäftigen.
              Ich habe mein Objekt mit einer Property an per DataBinding an eine Textbox gebunden. Beim Ändern (TextChanged) habe ich jedoch nicht bemerkt, was OnPropertyChanged bewirken soll ... kann das daran liegen, dass ich dies nicht für alle Properties der Klasse angelegt habe (so wie bei der Id)?

              Comment


              • #8
                Beim Ändern (TextChanged) habe ich jedoch nicht bemerkt, was OnPropertyChanged bewirken soll
                INotifyPropertyChanged wird dann relevant wenn deine Controls mitbekommen sollen wenn sich die Daten ändern (während sie bereits an das Control gebunden sind).

                Beispiel: Du bindest eine Datenmenge an ein DataGridView nur zum Anzeigen. Zum Bearbeiten bindest du die Datenmenge gleichzeitig an irgendwelche anderen Controls wie zum Beispiel Textboxen. Wenn du jetzt in den Textboxen irgendwas änderst wird das Grid diese Änderungen nicht mitbekommen. Denn die Klasse ~sagt~ dem Grid nicht von selbst das sich was geändert hat. Das wäre die Aufgabe des Events aus dem INotifyPropertyChanged Interface. Die Controls registrieren diesen Event um Änderungen der Klasse mitzubekommen. Genauso wäre es wenn du Daten in der Klasse im Code änderst. Ohne INotifyPropertyChanged würden gebundene Controls das nicht mitbekommen und die vorherigen Daten anzeigen.

                Comment


                • #9
                  Danke für die gute Erklärung, ich glaube (zumidnest in der Theorie) habe ich es jetzt verstanden!

                  Kann es sein, dass das Problem meiner Abfrage noch am Filter der Liste liegt, den ich inzwischen eingebaut habe?
                  Code:
                   List<Zuordnung> filteredList = list.Where(x => x.NummerBE == sNummer).ToList();

                  Comment


                  • #10
                    Glaube ich nicht. Solltest du aber leicht herausfinden können wenn du dir denn Inhalt von list einfach mal ansiehst. Wenn erst nach diesem ~Filtern~ deine Daten weg sind wäre das ein Fehler in deiner Zuordnung Klasse. Zum Beispiel weil du in den Properties die Backing Felder verwechselt hast. Du beziehst dich in der NummerBE Property auf das _nummerLs Feld anstatt auf _nummerBE oder sowas.

                    Die ist klar das diese Where Methode lokal ausgeführt wird und damit potentiel langsam ist? Wenn du list nicht mehr brauchst sondern nur filteredList dann solltest du denn Filter direkt in die Query auf dem Context mit einbeziehen und nicht nachträglich auf die schon lokal gezogenen Daten.

                    Comment


                    • #11
                      Entschuldige die späte Rückmeldung!
                      Es klappt nun auf jeden Fall - hatte noch einen kleinen Tippfehler in der Abfrage!

                      DANKE nochmals für deine Hilfe!

                      Comment

                      Working...
                      X