verwendetes Datenbanksystem: <MySQL>
Guten Morgen,
ich habe folgende Abfrage, bei der eigentlich nur die Daten angezeigt werden sollen,
-wo der Bestand > 0
-Preis geprüft = true
-Bestand gezählt = true
ist.
In der Ausgabe erscheinen leider aber alle Datensätze, deren Bestand gezählt wurde, aber noch kein Preis geprüft wurde.
Was ist an meiner Abfrage falsch??
var total =
(from i in ctx.tblInventurLager
join p in ctx.TblPreise on i.artikelnummer equals p.artikelnummer
where i.gezaehlt == true
where p.preisgeprueft == true
where i.inventurid == iIdInventur
where i.bestand > 0
orderby i.artikelnummer
group i by i.artikelnummer into Nummer
select new Inventur
{
Artikelnummer = Nummer.Key,
Bestand = (double)Nummer.Sum(x => x.bestand)
}).ToList();
Ich bin nicht ganz fit in LINQ aber die einzelnen where Anweisungen sollten wohl per && als And verknüpft werden.
Dann sollte deine Abfrage funktionieren oder?
var total = (from i in ctx.tblInventurLager
join p in ctx.TblPreise on i.artikelnummer equals p.artikelnummer
where i.gezaehlt == true &&
p.preisgeprueft == true &&
i.inventurid == iIdInventur &&
i.bestand > 0
orderby i.artikelnummer
group i by i.artikelnummer into Nummer
select new Inventur
{
Artikelnummer = Nummer.Key,
Bestand = (double)Nummer.Sum(x => x.bestand)
}).ToList();
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Ich bin nicht ganz fit in LINQ aber die einzelnen where Anweisungen sollten wohl per && als And verknüpft werden.
Das macht kein Unterschied.
Im Prinzip ist sein Ansatz ein Filter auf ein Filter auf ein Filter. Sollte exakt das gleiche Ergebnis wie && liefern, was eben mehrere Abfragen in einem Filter sind.
Die Lesbarkeit empfiehlt prinzipiell auch seine Schreibweise.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Leider wird immer noch nicht korrekt gefiltert.
Der Teil der Preisprüfung p.preisgeprueft == true && scheint ignoriert zu werden.
Ich habe Artikel, die nur gezählt werden oder wo der Bestand 0 ist. Diese werden korrekterweise nicht angezeigt.
Muss ich die Tabellen anderst verknüpfen?
Edit:
Nun habe ich für die Preistabelle ebenfalls noch die Id mit in die Bedingung aufgenommen und nun klappt es. Vielen Dank für die Hilfe!
....
i.inventurid == iIdInventur &&
p.inventurid == iIdInventur &&
...
Aktuell führst Du Deinen Inner Join auf die Artikelnummer.
Willst Du den Inner Join nur auf der ID haben, oder auf ID und Artikelnummer?
Deine jetzige Anpassung ist mit den Conditions im Startpost gar nicht erwähnt.
Willst Du beides haben, dann kannst Du folgendes schreiben:
from i in ctx.tblInventurLager
join p in ctx.TblPreise
on { i.artikelnummer, i.inventurid} equals { p.artikelnummer, p.inventurid }
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code