2011-04-17 63 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