Laden...

[erledigt] Linq to Entities: in der Abfrage string mit int vergleichen

Erstellt von Regenwurm vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.459 Views
R
Regenwurm Themenstarter:in
295 Beiträge seit 2008
vor 12 Jahren
[erledigt] Linq to Entities: in der Abfrage string mit int vergleichen

Hallo,

Ich habe eine LINQ Abfrage vor mir.
In der Abfrage sollen 4 Werte (je 2) miteinander verglichen werden.
Leider ist bei einer Abfrage der eine Typ als int vorhanden & der andere als string.

Wenn ich entweder ein Int.ToString() oder Convert.ToInt32() resp. Int32.Parse in die Abfrage setzen will, erhalte ich eine Exception > Fehlermeldung:

Exception Details: System.NotSupportedException: LINQ to Entities does not recognize the method 'Int32 Parse(System.String)' method, and this method cannot be translated into a store expression.

Was kann ich dagegen tun (ohne den Datentyp explizit in den Klassen zu ändern)?

        bool bInPersonTable =  (CompPerson.LoadPersonList().First(
                                    p => p.PersId == Int32.Parse(pNew.PersonenId) || p.UserID == pNew.UserId)
                                ) != null);

Gruess,
Regenwurm

€: ja pNew.PersonenId könnte ich vor der Abfrage konvertieren - aber geht das nicht anders? 😃

ServiceStack & Angular = =)

G
538 Beiträge seit 2008
vor 12 Jahren
p.PersId.ToString()

?

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

1.552 Beiträge seit 2010
vor 12 Jahren

Hallo Regenwurm.

Wie du selbst erkannt hast musst du vor der LINQ Abfrage den String nach int convertieren und diesen als Zahl bereitstellen.
Anders geht es nicht.

Jedoch könnstest du deine LINQ etwas ändern um das Laden der Person die zutrifft zu verhindern. Denn aktuell wird die zutreffende Person immer geladen. Jaja, ist ansich nicht schlimm, sind nicht viele Daten, aber trotzdem.
Das wie folgt:


CompPerson.LoadPersonList().Any(....)
CompPerson.LoadPersonList().Count(...) != 0

Jedoch sollte sich diese Überlegung nur stellen wenn CompPerson.LoadPersonList() KEINE Liste zurückgibt, d.h. sie NICHT materialisiert ist.

p.PersId.ToString()

Nö dies geht nicht. Dazu ist die SqlFunctions.StringConvert zuständig.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

R
Regenwurm Themenstarter:in
295 Beiträge seit 2008
vor 12 Jahren

Hi Michael,

Das mti dem Count ist mir vorhin gerade auch aufgefallen.. beträgt dieser < 1 wird eine Exception geworfen. Ich habe nun auch eine entsprechende If-Abfrage vorne hingesetzt.

Wie meinst du das genau mit dem Any?
Die Funktion muss nur überprüfen ob eine Person in einer bestimmten Tabelle bereits existiert.

Gruess,
Regenwurm

ServiceStack & Angular = =)

1.552 Beiträge seit 2010
vor 12 Jahren

Wie meinst du das genau mit dem Any?

Any gibt true zurück wenn im Set mindestens ein Element die Bedingung erfüllt.
Also wörtlich übersetzt.


bool a = "hallo".Count(c=>c='h') == 1;  // Zähl mir alle 'h' in "hallo" und ist dieser Zähler = 1?
bool b = "hallo".Any(c=>c='h');  Hat der String "hallo" ein 'h'?

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

R
Regenwurm Themenstarter:in
295 Beiträge seit 2008
vor 12 Jahren

Hi Michael,

Perfekt!
Nun ist die null Überprüfung dann wohl überflüssig.

Vielen Dank!

ServiceStack & Angular = =)