2009-07-03 10 views
12

Perché linq sta provando a controllare la seconda espressione comunque?Perché non funziona questo cortocircuito in lambda?

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

Qual è la soluzione alternativa?

Aggiornamento:
Si tratta di LINQ to SQL, naturalmente. Non può tradurre in SQL.

+0

È questo LINQ to SQL? – SLaks

+2

Improvvisamente trovo il>> e> = in questo codice molto confuso. :-) (E ho usato entrambi abbastanza spesso, ma mai insieme nella stessa dichiarazione.) –

+0

sì. bene, grazie, ho capito :) – rudnev

risposta

11

Si utilizza .Where su un Table<>?

In questo caso, prima di poter afferrare qualsiasi dato, è necessario convertire LINQ in SQL e per farlo deve convertire lo string in un decimal. Non sta ancora provando a eseguire i confronti, sta cercando di costruire i costrutti necessari per recuperare i dati.

-1

Questo aiuto?

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

Notato il() intorno alla seconda condizione? Non penso che funzioni, ma in generale preferisco mettere() attorno ad ogni condizione nel mio codice. In questo modo, il compilatore sa quali parti appartengono insieme quando compila il codice, per prepararlo per la valutazione corto-circuito ...

-1

non posso riprodurre alcun problema con il corto circuito valutazione ...

Penso che questo restituisce qualcosa come:

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

corto circuito funziona bene qui.

Sospetto che altri elementi di Enumerable possano valutare la prima condizione (String.IsNullOrEmpty(someNullString)) su false. Puoi confermare questo?

Fornire un po 'più di codice in modo che possiamo analizzare questo.

-1

Avete una variabile t in qualsiasi ambito che può essere valutato?

Hai provato con la parentesi in questo modo:

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

?

+0

=> definisce l'ambito di t. –

-1

C'è una soluzione sul The || (or) Operator in Linq with C# in base al quale si dovrebbe fare nel vostro caso qualcosa come:

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

Naturalmente questo potrebbe non essere la soluzione avete bisogno nel vostro caso particolare, ma almeno dà un idea di come aggirare l'errore.

Problemi correlati