关于可空列的LINQ-Join表

时间:2011-04-17 22:28:58

标签: .net vb.net linq linq-to-dataset

如何在可空列上加入表?

我有以下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中做到这一点还是有另一种选择?

提前谢谢。


解决方案:

问题是DataSet不支持Nullable-Types,但如果在整数列上查询任何NULL值,则会生成InvalidCastException(感谢Martinho)。 来自dahlbyk的修改后的LINQ查询几乎没有修改。 DataSet为AllowDbNull = True的每一列生成一个boolean-property,在本例中为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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

虽然可以使用LINQ to Datasets来解决此问题,但使用预定义的DataRelations而不是ad-hoc连接可能会发现更好的性能。有关数据关系的信息,请参阅http://msdn.microsoft.com/en-us/library/dbwcse3d.aspx

如果您确实使用LINQ to Datasets,您可能希望在http://www.manning.com/marguerie/查看我们的免费奖励第14章。