2012-01-10 14 views
11

Per questa query LINQ sto diventando l'eccezione di seguito:InvalidCastException in una query LINQ

(from row in ds.Tables[0].AsEnumerable() 
where row.Field<string>("Dept_line_code") == DeptCode && 
row.Field<string>("Skill_Name") == skill && 
row.Field<string>("Acct_Code") == account && row.Field<string>("Location") == dtNewTable.Rows[intRow]["Location"].ToString() 
select row.Field<int>("Presently_Available") == null ? 0 : row.Field<int>("Presently_Available") 
).FirstOrDefault(); 

informazioni Eccezione:

Tipo di eccezione: InvalidCastException

messaggio

eccezione: non può lanciare DBNull .Valore per digitare "System.Int32". Si prega di utilizzare un tipo nullable.

Non conosco il tipo nullable e non riesco a capire come utilizzare il tipo nullable per superare questa eccezione.

+2

Brevemente: per default, i tipi primitivi (come 'int',' double', 'galleggiante ', ...) non può essere assegnato valori nulli. La soluzione a questo problema è di usare un tipo nullable invece (come 'int?'), Che è in realtà solo un wrapper attorno al tipo primitivo. – ean5533

+0

Sembra che si usi DataSet, probabilmente compilato da DataAdapter. Quindi non è possibile compilare un DataSet [ma un DataTable] (http://msdn.microsoft.com/en-us/library/905keexk.aspx), se si è certi che la query risultante contenga solo la singola tabella. – abatishchev

+0

Quando è necessario utilizzare i tipi nullable? quali scenari? perché dobbiamo usare lo stesso? Hai bisogno di informazioni sullo scopo e Pro o Contro con i tipi di NUllable? – venkat

risposta

21

devi rendere int accept null value => int?

row.Field<int?>("Presently_Available") == null ? 0 : row.Field<int>("Presently_Available") ; 

e questo è un link per i tipi nullable

+2

Probabilmente dovresti fornire un link o una breve spiegazione dei tipi annullabili nella tua risposta. L'OP non capirà perché "int?" Risolve il suo problema. – ean5533

+1

L'ho appena modificato;) – Akrem

+0

Wow, un paio d'ore di ricerche per scoprire ho solo bisogno di un punto interrogativo! – mack

7
select row.Field<int?>("Presently_Available") 
5

cambiamento row.Field<int> a row.Field<int?>