verwendetes Datenbanksystem: Oracle 9
Hallo zusammen
Ich habe nicht unbedingt ein Problem, möchte aber etwas nachfragen, was ich nicht verstehe.
Ich beschäftige mich zur Zeit mit Entity Framework. Dabei kann man mit einer .Where-Methode die Daten einschränken.
Nun die Kuriosität.
Wenn ich überprüfen will, ob ein Wert einer Spalte mit dem Wert einer Variablen(String) übereinstimmt, so funktioniert dies nicht. wenn ich aber einfach mal einen Wert hinschreibe("Wert") so funktioniert dieses.
Nachdem ich dies herausgefunden habe, habe ich es noch auf andere Weise versucht und zum Teil Erfolg gehabt. Nur verstehe ich leider nicht wieso dies zum Teil geht und zum Teil nicht.
Ich liste mal ein paar Versuche auf:
alleDaten.VersionSet.Where(vs => vs.ProjektName.Trim().Equals(Projektname)) //geht
alleDaten.VersionSet.Where(vs => vs.ProjektName.Contains(Projektname)) //geht
alleDaten.VersionSet.Where(vs => vs.ProjektName == Projektname) //geht nicht
alleDaten.VersionSet.Where(vs => vs.ProjektName == "PEKA") //geht
alleDaten.VersionSet.Where(vs => vs.ProjektName.Trim() == Projektname) //geht
Es ist mir klar, dass es so aussieht als ob die Leerschläge im DB-Eintrag diesen "Fehler" verursachen. Ich möchte aber wissen, wieso == "PEKA" funktioniert, während == Projektname nicht funktioniert.(Projektname hat auch den Wert PEKA). Zudem funktionieren alle Versionen, wenn ich einen Double Wert vergleiche.
Kann mit dies jemand erklären?
ohne EF oder Linq jetzt jemals eingesetzt zu haben würde ich schätzen, daß das "==" bei einer Variablen auf der rechten Seite die Objektreferenz prüft, da String ein Referenztyp ist (anders als Double, das ist ein Werttyp). Und da das Objekt "vs.ProjektName" nicht gleich der lokalen Variable "Projektname" ist, werden keine Daten gefunden.
Funktionierts denn, wenn du statt des Variablennamens die ToString()-Methode des Variablennamens benutzt? Also:
alleDaten.VersionSet.Where(vs => vs.ProjektName == Projektname.ToString())
Das denke ich nicht, denn der == Operator ist für den Reference-Type string überladen und vergleicht die Inhalte.
Ich vermute eher 0 Bytes oder verschiedene Encodings.
Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!
YARRRRRR!
was ich grad sehe:
alleDaten.VersionSet.Where(vs => vs.ProjektName.Trim() == Projektname) //geht
wenn das geht, liegt das wahrscheinlich an Leerzeichen entweder in vs.ProjektName oder in der Variable Projektname.
Das sollte dann funktionieren:
alleDaten.VersionSet.Where(vs => vs.ProjektName.Trim() == Projektname.Trim())
E: das könnte u.a. durch die Verwendung von char/nchar statt varchar/nvarchar im Datenbankfeld für den Projektnamen auftreten.
Wieso aber geht dann das:
alleDaten.VersionSet.Where(vs => vs.ProjektName == "PEKA")
Tippe weiterhin auf Nullbytes.
Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!
YARRRRRR!
man kann im Code ja leider nicht erkennen, ob er immer auf denselben Projektnamen testet.
Hallo chanderegg,
kannst du mal etwas kompletteren Code zeigen, mit dem du testest? Denn soweit ich das sehe, erstellst du ja erstmal ein Queryable, die Query wird ja noch nicht ausgeführt. Vielleicht ändert sich auch der Wert in der Variablen Projektname
, bis du die Query letztendlich ausführst. Projektname.Trim()
führt dazu, dass du direkt an dieser Stelle (Erstellung des Queryable) den Wert von Projektname
auswertest (wenn du nur Projektname
wird der Wert wie gesagt erst später ausgelesen).
Das sind halt so kleine Feinheiten, auf die man bei anonymen Methoden (was Lambda-Ausdrücke ja letztendlich sind) aufpassen muss (Wenn man in einem foreach die "Laufvariable" direkt in eine anonyme Methode einbaut, hat diese dann bei allen den gleichen Wert [und zwar den letzten aus der Auswertung]).
Gruß
dN!3L
Hallo zusammen
Danke für die vielen Antworten.
Im letzten Post wurde noch mehr Code verlangt.
SGEntities alleDaten = new SGEntities();
public List<Version> dazugehörigeVersionenLaden(String Projektname)
{
List<Version> VersionDaten = new List<Version>();
foreach (Version version in alleDaten.VersionSet.Where(vs => vs.ProjektName.Trim() == Projektname) )
{
VersionDaten.Add(version);
}
return VersionDaten;
}
Ich habe es jetz mit dieser Version gelöst und es funktioniert gut. Der Thread war einfach für mich, damit ich auch verstehe was ich mache.
@GarlandGreene: Ich habe natürlich verschiedene Projektnamen (sonst würde die Variabel keinen Sinn machen) und habe diese auch alle getestet. Es haben alle so funktioniert wie angegeben.