12 Stimmen

Warum funktioniert dieser Kurzschluss im Lambda nicht?

Warum versucht Linq trotzdem, den zweiten Ausdruck zu überprüfen?

.Where(t =>  String.IsNullOrEmpty(someNullString) || t.SomeProperty >= Convert.ToDecimal(someNullstring))

Was ist die übliche Arbeitsweise?

Update:
Natürlich geht es um LINQ to SQL. Es kann nicht in SQL übersetzt werden.

12voto

Benjamin Autin Punkte 4075

Wird .Where auf eine Tabelle<> verwendet?

Wenn ja, muss es, bevor Daten abgerufen werden können, den LINQ in SQL konvertieren und dazu muss es den string in ein decimal umwandeln. Es versucht noch nicht, die Vergleiche tatsächlich durchzuführen, sondern versucht die Konstrukte aufzubauen, die zur Datenabfrage erforderlich sind.

-1voto

bruno conde Punkte 47059

Ich kann kein Problem mit der _Kurzschluss_auswertung reproduzieren...

Ich denke, dass sich das etwa wie folgt auswertet:

[CompilerGenerated]
private static bool b__f(MyObject t)
{
    return (String.IsNullOrEmpty(someNullString) 
                 || t.SomeProperty >= Convert.ToDecimal(someNullstring));
}

Kurzschluss funktioniert hier gut.

Ich vermute, dass andere Elemente in Ihrem Enumerable die erste Bedingung (String.IsNullOrEmpty(someNullString)) als falsch auswerten. Können Sie dies bestätigen?

Geben Sie bitte etwas mehr Code an, damit wir dies analysieren können.

-1voto

eKek0 Punkte 22479

Hast du eine Variable t in einem Scope, die möglicherweise ausgewertet werden kann?

Hast du es mit Klammern versucht, wie hier:

.Where(t =>  (String.IsNullOrEmpty(someNullString) || 
             t.SomeProperty >= Convert.ToDecimal(someNullstring)))

?

-1voto

yoel halb Punkte 11337

Es gibt einen Workaround auf The || (or) Operator in Linq with C# laut dem Sie in Ihrem Fall etwas Ähnliches tun würden:

.Where(t =>  t.SomeProperty >= Convert.ToDecimal(someNullstring ?? "0"))

Natürlich ist dies möglicherweise nicht die Lösung, die Sie in Ihrem speziellen Fall benötigen, aber zumindest gibt es eine Idee, wie man den Fehler umgehen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X