Laden...

Kuriosität von Entity Framework

Erstellt von chanderegg vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.206 Views
C
chanderegg Themenstarter:in
101 Beiträge seit 2008
vor 15 Jahren
Kuriosität von Entity Framework

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?

G
497 Beiträge seit 2006
vor 15 Jahren

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())

1.200 Beiträge seit 2007
vor 15 Jahren

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!

G
497 Beiträge seit 2006
vor 15 Jahren

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.

1.200 Beiträge seit 2007
vor 15 Jahren

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!

G
497 Beiträge seit 2006
vor 15 Jahren

man kann im Code ja leider nicht erkennen, ob er immer auf denselben Projektnamen testet.

2.891 Beiträge seit 2004
vor 15 Jahren

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

C
chanderegg Themenstarter:in
101 Beiträge seit 2008
vor 15 Jahren

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.