2009-07-03 7 views
12

Warum versucht linq den zweiten Ausdruck trotzdem zu überprüfen?Warum funktioniert dieser Lambda-Kurzschluss nicht?

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

Was ist die übliche Problemumgehung?

Update:
Es ist über LINQ to SQL, natürlich. Es kann nicht in SQL übersetzt werden.

+0

Ist das LINQ zu SQL? – SLaks

+2

Ich finde plötzlich das => und> = in diesem Code sehr verwirrend. :-) (Und ich habe beide ziemlich oft benutzt, aber nie zusammen in der gleichen Aussage.) –

+0

ja. gut, danke, ich habe es :) – rudnev

Antwort

11

Wird die .Where auf einer Table<> verwendet?

Wenn ja, dann bevor irgendwelche Daten erfasst werden können, muss es die LINQ in SQL konvertieren und dazu muss es die string in eine decimal konvertieren. Es versucht nicht, tatsächlich die Vergleiche noch durchzuführen, es versucht, die Konstrukte zu erstellen, die notwendig sind, um Daten abzurufen.

-1

Hilft das?

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

Bemerkte die() um die zweite Bedingung? Ich denke nicht, dass es funktioniert, aber im Allgemeinen ziehe ich() um jede Bedingung in meinem Code vor. Auf diese Weise weiß der Compiler, welche Teile zusammengehören, wenn sie den Code kompilieren, es für Kurzauswertung zur Vorbereitung ...

-1

ich kein Problem reproduzieren kann, mit der Kurzschluss Auswertung ...

ich denke, das auswertet, um so etwas wie:

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

Kurzschluss hier gut funktioniert.

Ich vermute, andere Elemente in Ihrer Enumerable werten die erste Bedingung (String.IsNullOrEmpty(someNullString)) auf falsch aus. Kannst du das bestätigen?

Geben Sie ein bisschen mehr Code, damit wir das analysieren können.

-1

Haben Sie eine Variable t in einem beliebigen Bereich, der ausgewertet werden kann?

Haben Sie versucht, mit Klammern wie folgt aus:

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

?

+0

Der => definiert den Umfang von t. –

-1

eine Abhilfe gibt auf The || (or) Operator in Linq with C# ist, nach dem Sie sich wie in Ihrem Fall etwas tun würden:

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

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

Verwandte Themen