2012-04-18 12 views
5

Ho la seguente query LINQL'oggetto Nullable deve avere un valore - perché?

from p in dc.Purchases 
where invoiceNumber == null || p.InvNumber == invoiceNumber.Value 
select p; 

Il 'InvoiceNumber' è un int nullable - quando è nullo, il programma getta un 'oggetto Nullable deve avere un errore di valore'. Perché è questo quando controlla in modo esplicito se è null prima? C'è un modo per aggirare questo?

Grazie,

+3

C'è qualche differenza quando si modifica il controllo Null su 'fatturaNumber.HasValue'? –

+0

Che fornitore di Linq stai usando? Linq to sql, entity framework, linq to objects ...? – AakashM

+0

LINQ to SQL. Nessuna differenza quando si usa HasValue – Chris

risposta

0

provare questo:

from p in dc.Purchases 
where invoiceNumber == null ||(invoiceNumber!=null && p.InvNumber == invoiceNumber.Value) 
select p; 
+2

non ha senso - il || l'operatore valuterà il secondo argomento solo se il primo è falso – Bond

0

controllare questo

from p in dc.Purchases 
where (invoiceNumber == null ? p.InvNumber == null : p.InvNumber == invoiceNumber.Value) 
select p; 
0

che dire

from p in dc.Purchases 
where (invoiceNumber ?? p.InvNumber) == p.InvNumber 
select p; 

ma, vorrei porre la questione, se invoiceNumber è 012.perché eseguire questa dichiarazione?

+0

Se è nullo, dovrebbe recuperare tutto – Chris

+0

@Chris, quindi un'altra istruzione senza quella clausola dove sarebbe più efficiente eseguire il database. – Jodrell

0

Utilizzare la proprietà HasValue per verificare se un valore Nullable ha un valore.

from p in dc.Purchases 
where !invoiceNumber.HasValue || p.InvNumber == invoiceNumber.Value 
select p; 
0

Non dici, ma ho il sospetto che p.InvNumber è annullabile pure. In tal caso, non utilizzare il .Value:

from p in dc.Purchases 
where invoiceNumber == null || p.InvNumber == invoiceNumber 
select p; 
0

non è necessario controllare per nulla in modo esplicito. potrebbero esserci due casi con valori nullable che saranno nulli o con qualche valore.

ad es.

CASO 1-

int ? invoiceNumber = null; 
var prods = from p in dc.Purchases 
      where p.InvNumber == invoiceNumber 
      select p; 

CASO 2-

int ? invoiceNumber = 100; 
var prods = from p in dc.Purchases 
      where p.InvNumber == invoiceNumber 
      select p; 

stessa dichiarazione LINQ funzionerà in entrambi i casi.

+0

Perché il caso 1 ha una clausola where? – Jodrell

+0

Voglio solo mostrare che la stessa query di linq funzionerà in entrambi i casi. o invoiceNumber è nullo o ha qualche valore. – userGS

0

Il concetto di base di nullable tipo è ... tipo sottostante avrà tutti i valori specificati nella sua gamma + un valore null, per aumentare la flessibilità con la programmazione di database.

tipi nullable ha due proprietà sola lettura 1) HasValue 2) Value

HasValue è boolean tipo ed è impostato a true automaticamente se il valore ha un certo valore in esso. Quindi, per comparazioni, è necessario utilizzare prima HasValue e poi Value. Se si utilizza direttamente Value e se è null, verrà generata l'eccezione di cui sopra.

Tenendo presente questo, dubito anche di questo frammento.dove invoiceNumber == null si dovrebbe provare invoiceNumber.Value==null (non InvoiceNumber)

o

where invoiceNumber.HasValue && p.InvNumber == invoiceNumber.Value 

grazie

0

Il problema può essere in Linq to Sql - sta cercando di convertire in cui dichiarazione di SQL in modo InvoiceNumber. Il valore può essere chiamato anche se è nullo.

favore basta provare dove invoiceNumber == null || p.InvNumber == invoiceNumber.

Spero che possa essere d'aiuto.

2

Penso che ci sia qualcosa di sbagliato nella tua richiesta. Dal codice che hai fornito, suppongo che invoiceNumber sia una variabile locale o un parametro. Se questo è il caso, allora perché stai controllando anche se invoiceNumber == null nella tua query? Tale controllo deve essere eseguito separatamente dalla query:

if(invoiceNumber == null) 
{ 
    return dc.Purchases; 
    // the query would evaluate to this because invoiceNumber == null will allways return true. 
} 
else 
{ 
    return 
     from p in dc.Purchases 
     where p.InvNumber == invoiceNumber.Value 
     select p; 
} 
Problemi correlati