如何在可空列上连接表?
我有以下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章。