可空列上的LINQ-Join表



如何在可空列上连接表?

我有以下LINQ-query, 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'转换为类型'Integer'无效":

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

所以我可以在查询中添加一个WHERE RMA.fiCharge IS NOT NULL。但是如何在LINQ中做到这一点,或者有其他选择吗?

提前谢谢你。


解决方案:

问题是数据集不支持空类型,但如果您查询整数列上的任何空值,则会生成InvalidCastException(感谢Martinho)。来自dahlbyk的修改后的linq查询只做了很少的修改。数据集为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

您是否尝试将null检查添加到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

虽然您可以使用LINQ to Datasets来解决这个问题,但是使用预定义的datrelations而不是临时连接可能会获得更好的性能。有关数据关系的信息,请参阅http://msdn.microsoft.com/en-us/library/dbwcse3d.aspx。

如果你确实使用LINQ来处理数据集,你可能想在http://www.manning.com/marguerie/上查看我们的免费奖励第14章。

相关内容

  • 没有找到相关文章

最新更新