2012-06-28 22 views
1

我在數據字段可能是bool(true/false)或int(1/0)的DataTable上使用LINQ查詢。 LINQ查詢請求Field方法的類型,如果數據字段不同,則引發InvalidCastException(不能被捕獲)。LINQ:字段可以是int或布爾 - 我如何使用它沒有InvalidCastException?

var query = 
    from tbl12 in t12.AsEnumerable() 
    where tbl12.Field<int>("theField") == 0 
    select new { T12 = tbl12 }; 

var query = 
    from tbl12 in t12.AsEnumerable() 
    where tbl12.Field<bool>("theField") == false 
    select new { T12 = tbl12 }; 

我怎樣才能解決這個問題?我想過濾結果,其中字段= false或0.

+1

表中的* actual *支持類型是什麼? –

+0

@Anthony Pegram它可以是布爾值或整數。這取決於我們接口的程序版本。 – Marcus

+0

因此,每個程序連接到不同的表? –

回答

0

我已經找到答案:將類型設置爲object並在該字段上使用ToString()方法。

即:

var query = 
    from tbl12 in t12.AsEnumerable() 
    where tbl12.Field<object>("theField").ToString() == "false" || tbl12.Field<object>("theField").ToString() == "0" 
    select new { T12 = tbl12 }; 
+0

對於這樣的人來說,爲什麼? – Marcus

+0

我沒有-1它,但我想這只是因爲這是一個不好的做法,效率低下。它需要將實際值作爲對象裝箱,然後使用它的ToString()調用並依賴它返回您正在查找的內容。它還需要您兩次調用Field方法。 –

0

我想不出一個真正乾淨的版本,對於這個問題,所以大概要做到這一點(和相關的東西),最好的辦法是使用Convert類,像這樣:

var query = 
from tbl12 in t12.AsEnumerable() 
where !Convert.ToBoolean(tbl12.Field<object>("theField")) 
select new { T12 = tbl12 }; 

這並不美觀,但至少這個變體不依賴字符串轉換來獲得結果。

相關問題