Benutzer mit den meisten Antworten
eine Abfrage - verschiedene Ergebnisse

Frage
-
Hallo,
folgende LINQ-AbfrageDim 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
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
- Als Antwort vorgeschlagen Stefan FalzModerator Mittwoch, 7. März 2018 15:37
- Als Antwort markiert Stefan FalzModerator Samstag, 31. März 2018 18:53
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 -
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
-
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 -
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 -
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
-
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 -
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
-
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 -
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
-
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
- Als Antwort vorgeschlagen Stefan FalzModerator Mittwoch, 7. März 2018 15:37
- Als Antwort markiert Stefan FalzModerator Samstag, 31. März 2018 18:53