可空列上的 LINQ-Join 表

Tim*_*ter 5 .net linq vb.net 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
Run Code Online (Sandbox Code Playgroud)

我在以下位置收到“从'DBNull'类型转换为'Integer'类型无效” query.ToArray()

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

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

先感谢您。


解决方案:

问题是 DataSet 不支持 Nullable-Types,但如果您在整数列上查询任何 NULL 值,则会生成 InvalidCastException(感谢 Martinho)。来自 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
Run Code Online (Sandbox Code Playgroud)

dah*_*byk 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
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,您可以尝试这样的操作:

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
Run Code Online (Sandbox Code Playgroud)