2011-04-17 72 views
4

如何在可空列上加表?LINQ-在可空列上加入表

我有以下LINQ查詢,RMA.fiCharge可以爲NULL:

Dim query = From charge In Services.dsERP.ERP_Charge _ 
        Join rma In Services.dsRMA.RMA _ 
        On charge.idCharge Equals rma.fiCharge _ 
        Where rma.IMEI = imei 
       Select charge.idCharge 

我得到一個在query.ToArray() 「從類型轉換 '爲DBNull' 到類型 '整數' 無效」:

Dim filter = _ 
     String.Format(Services.dsERP.ERP_Charge.idChargeColumn.ColumnName & " IN({0})", String.Join(",", query.ToArray)) 

所以我可以在查詢中附加一個WHERE RMA.fiCharge IS NOT NULL。但如何在LINQ中做到這一點,或者有另一種選擇?

預先感謝您。


解決方案:

的問題是,該數據集不支持可空類型,但如果你在查詢一個整列(感謝Martinho)任何NULL值產生一個InvalidCastException。 來自dahlbyk的經過修改的LINQ查詢幾乎沒有任何修改。 DataSet爲AllowDbNull = True的每列生成布爾屬性,在這種情況下爲IsfiChargeNull

Dim query = From charge In Services.dsERP.ERP_Charge _ 
      Join rma In (From rma In Services.dsRMA.RMA _ 
         Where Not rma.IsfiChargeNull 
         Select rma) 
       On charge.idCharge Equals rma.fiCharge _ 
      Where rma.IMEI = imei 
      Select charge.idCharge 
+1

您使用可爲空的整數嗎?你爲什麼用linq-to-objects來標記它? LINQ到對象有**沒有SQL **。 – 2011-04-17 22:29:52

+0

不,該類型數據集中的DataColumn類型是整數。 – 2011-04-17 22:34:35

+0

那就是你的問題。您需要可以爲空的整數。 – 2011-04-17 22:37:05

回答

3

您是否嘗試過將空檢查添加到where子句中?

Dim query = From charge In Services.dsERP.ERP_Charge _ 
      Join rma In Services.dsRMA.RMA _ 
       On charge.idCharge Equals rma.fiCharge _ 
      Where rma.fiCharge <> Nothing AndAlso rma.IMEI = imei 
      Select charge.idCharge 

如果不工作,你可以嘗試這樣的事:

Dim query = From charge In Services.dsERP.ERP_Charge _ 
      Join rma In (From rma in Services.dsRMA.RMA _ 
         Where rma.fiCharge IsNot Nothing 
         Select rma) 
       On charge.idCharge Equals rma.fiCharge _ 
      Where rma.IMEI = imei 
      Select charge.idCharge 
+0

謝謝,第二個查詢在用'Not rma.IsfiChargeNull'替換'rma.fiCharge <> Nothing'後有效:) – 2011-04-18 07:49:42

0

雖然你可以使用LINQ到數據集來解決這個問題,你可以使用預定義的DataRelations而不是找到更好的性能特設聯接。有關數據關係的信息,請參閱http://msdn.microsoft.com/en-us/library/dbwcse3d.aspx

如果你確實使用LINQ to Datasets,你可能想看看我們的免費紅利第14章http://www.manning.com/marguerie/

+0

我不認爲DataRelations比[LINQ-Joins]快得多,因爲它們也使用散列算法鏈接表](http://stackoverflow.com/questions/5551264/why-is-linq-join-so-much-faster-than-linking-with-where),但LINQ更靈活。 – 2011-10-19 18:46:24

+0

我認爲那些使用散列算法的優化只適用於使用.Net 4+的情況。如果使用3.5,則數據集DataRelation是更好的選擇。 – 2011-10-20 16:39:35