none
eine Abfrage - verschiedene Ergebnisse

    Frage

  • Hallo,
    folgende LINQ-Abfrage

    Dim xCOUNT = 
       (From c In db.tbl_GEN_ZUORDNUNG
        Where (c.GEN_ID_PARENT = intParentGenID) And (c.tbl_GENSTAND.tbl_AENDERUNG.BAUTEIL_ID = BTID)
        Select c).Count

    sollte ein Ergebnis > 0 zurückgeben, tu es aber nicht.

    Wird die Abfrage im LINQPad gestestet, wird das korrekte Ergebnis ausgegeben.

    Dim xCOUNT = 
    (From c In tbl_GEN_ZUORDNUNGs _ 
     Where(c.GEN_ID_PARENT = GenID) And (c.Tbl_GENSTAND.Tbl_AENDERUNG.BAUTEIL_ID = BTID) _ 
     Select c).Count.Dump
    

    Wenn ich den "ganz normalen" SQL-Syntax verwende, so wird auch das korrekte Ergebnis ausgegeben.

    SELECT COUNT(*) AS xCOUNT 
     FROM [tbl_GEN_ZUORDNUNG] AS [GZ] 
      INNER JOIN [tbl_GENSTAND] AS [G] ON [GZ].[GEN_ID] = [G].[GEN_ID] 
      INNER JOIN [tbl_AENDERUNG] AS [A] ON [A].[AENDERUNG_ID] = [G].[AENDERUNG_ID] 
     WHERE ([GZ].[GEN_ID_PARENT] = {0}) AND ([A].[BAUTEIL_ID] = {1})

    Eben nur nicht im Linq-Syntax im Visual Studio.

    Weiß vielleicht jemand woran das liegt?


    Viele Grüße, Volker



    • Bearbeitet Volker S Donnerstag, 22. Februar 2018 07:17
    Donnerstag, 22. Februar 2018 07:15

Antworten

  • Ich stell mich aber auf doof an.
    Dim xCOUNT = (From gz In db.tbl_GEN_ZUORDNUNG
                                  Join g In db.tbl_GENSTAND On gz.GEN_ID Equals g.GEN_ID
                                  Join a In db.tbl_AENDERUNG On g.AENDERUNG_ID Equals a.AENDERUNG_ID
                                  Select gz).Count


    Viele Grüße, Volker

    Montag, 26. Februar 2018 13:34

Alle Antworten

  • Hi Volker,
    hast Du geprüft, ob intParentGenID auch den richtigen Wert hat?

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 22. Februar 2018 07:45
  • Hallo Peter,
    Danke für dein interesse.
    Na klar, hab auch überall einmal die gleichen Zahlen anstatt der Variablen reingetan.
    Ich versteh es einfach nicht.

    Vor allem, da ja auch innerhalb der Funktion, mit unterschiedlichem Syntax (Linq vs Classic-SQL) ein anderes Ergebnis herauskommt. Da benutze ich ja auch die selben Variablen.


    Viele Grüße, Volker




    • Bearbeitet Volker S Donnerstag, 22. Februar 2018 07:58
    Donnerstag, 22. Februar 2018 07:55
  • Hallo Volker,

    deine Abfragen sind unterschiedlich.

    In der LINQ Abfrage gehst Du ausschließlich auf tbl_GEN_ZUORDNUNG. In LinqPad auf tbl_GEN_ZUORDNUNGs (also mit "s" am Schluss). Das SQL Statement verbindet zusätzlich zu tbl_GEN_ZUORDNUNG noch zwei Tabellen per INNER JOIN, was dazu führt, dass die Ergebnisse in keinster Weise vergleichbar sind.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 22. Februar 2018 08:43
    Moderator
  • Hi Volker,
    die Abfragen sind doch sehr unterschiedlich.

    Die erste Abfrage greift auf das Repository zu und nutzt 2 Werte für die Filterung (Vergleiche) in der Abfrage. Sind die Filterwerte wie gewünscht und ist das Repository auch mit den gewünschten Datenobjekten gefüllt?

    Die zweite Abfrage geht auf ein anderes Repository und nutzt andere Variablen für die Filterung.

    Die dritte Abfrage arbeitet ohne Filterung nur über die Schnittmenge (Join).

    Das sind schon beträchtliche Unterschiede.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 22. Februar 2018 08:46
  • Hallo Stefan, hallo Peter,
    LINQPad hang automatisch an die Tabellen ein "s" dran, wenn diese verbunden werden.
    Die Datenherkunft ist absolut identisch. Könnt ihr mir glauben.
    Und zu LINQ vs Classic-SQL:

    Im Linq-Statement wird doch auch nur über die Beziehungen gejoint.

    Where(c.GEN_ID_PARENT = GenID) And (c.Tbl_GENSTAND.Tbl_AENDERUNG.BAUTEIL_ID = BTID) 

    Das ist doch an und für sich das gleiche. Und nach Classic-SQL übersetzt ist das doch das gleiche wie ein Joinen der Tabellen. Oder etwa nicht? Das find ich ja das geniale an LINQ und hat bis jetzt immer funktioniert.

    Oder sollte ich so arg auf dem Holzweg sein?

    BTW:
    Wie kann ich denn prüfen, welchen SQL-String der Compiler zum SQL-Server absetzt? Gibt es dafür einen Live-Viewer oder so etwas in der Art?


    Viele Grüße, Volker



    • Bearbeitet Volker S Donnerstag, 22. Februar 2018 09:27
    Donnerstag, 22. Februar 2018 09:24
  • Hallo Volker,

    SQL Server seitig kannst Du das abgesetzte Statement bspw. über den SQL Server Profiler sehen.

    Im VS Debugger bspw. über <Query>.ToString()

    Dim query = ( From n In db.Table Where ... )
    
    Dim querySql As String = query.ToString()
    
     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 22. Februar 2018 09:51
    Moderator
  • So einfach...
    Das macht es jedenfalls deutlich, warum  es nicht funktioniert.
    Folgende Meldung:
    "Für die Auswertung muss vorübergehend ein Thread ausgeführt werden. Verwenden Sie das Überwachungsfenster, um die Auswertung auszuführen."

    ??
    Nun ist klar warum "etwas falsches" zurückgegeben wird.

    Aber was bedeutet das? Und warum funktioniert es im LINQPad?


    Viele Grüße, Volker

    Donnerstag, 22. Februar 2018 10:14
  • Hallo Volker,

    bzgl. der Fehlermeldung: einfach nochmal auf das Icon rechts neben der Meldung klicken, dann solltest Du das generierte SQL Statement sehen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 22. Februar 2018 10:32
    Moderator
  • Hab den Querstring jetzt einmal in eine Stringvariable geschrieben, hab es vorher per Direktfenster ausgeben lassen.

    Jetzt wird er auch korrekt ausgegeben.
    Und siehe da, Problem erkannt.
    Also die Umsetzung erfolgt schon, wie oben beschrieben nach Classic-SQL in genau dem Stil.

    Im LINQ-Syntax wird allerdings auf das GEN_ID_PARENT Feld gejoint, da hier zwei Felder in Beziehung stehen.

    Es sollte aber auf das Feld GEN_ID gejoint werden. Kann man das im LINQ-Statement irgendwie einstellen?

    OT:

    Warum zerhackt dieser Editor andauernd den Text, wenn man einen Absatz löscht?

    So wie hierNeuer gelöschter Absatz


    Viele Grüße, Volker

    Donnerstag, 22. Februar 2018 11:07
  • Ich stell mich aber auf doof an.
    Dim xCOUNT = (From gz In db.tbl_GEN_ZUORDNUNG
                                  Join g In db.tbl_GENSTAND On gz.GEN_ID Equals g.GEN_ID
                                  Join a In db.tbl_AENDERUNG On g.AENDERUNG_ID Equals a.AENDERUNG_ID
                                  Select gz).Count


    Viele Grüße, Volker

    Montag, 26. Februar 2018 13:34