VB.NET Linq查询左外部联接left为空

时间:2020-05-21 18:38:36

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

我正在尝试使用类似于SQL中的linq查询:

SELECT pos.*, cl.cltyp_level FROM TPSTAFFPOS pos LEFT OUTER JOIN TSTAFFCLTYP cl ON pos.pos_cllvlid = cl.cltyp_id

我尝试了一些事情。

Dim query = (From pos In TaRRDataSet.TPSTAFFPOS
             Join cl In TaRRDataSet.TSTAFFCLTYP
             On pos.pos_cllvlid Equals cl.cltyp_id
             Where pos.pos_id.Equals(CInt(text))
             Select cl.cltyp_level, pos).Distinct.ToArray

我也尝试过加入群组:

Dim query = (From pos In TaRRDataSet.TPSTAFFPOS
             Group Join cl In TaRRDataSet.TSTAFFCLTYP
             On pos.pos_cllvlid Equals cl.cltyp_id Into cc = Group
             From cl In cc.DefaultIfEmpty()
             Select cl.cltyp_level, pos).Distinct.ToArray

问题是pos.pos_cllvlid可能为空。 cl表只是一个查找表。 pos中的字段可以为NULL。即使pos.pos_cllvlid为null,如何选择pos行。我搜索并找到该组加入,但我仍然得到的值是dbnull。这是数据示例:

TPSTAFFPOS

| pos_id | pos_name   | pos_cllvlid |
|--------|------------|-------------|
| 1      | Position 1 | 1           |
| 2      | Position 2 | NULL        |
| 3      | Position 3 | 2           |

TSTAFFCLTYP

| cltyp_id | cltype_value |
|----------|--------------|
| 1        | TS           |
| 2        | S            |
| 3        | I            |

结果

| pos_id | pos_name   | pos_cllvlid | cltyp_value |
|--------|------------|-------------|-------------|
| 1      | Position 1 | 1           | TS          |
| 2      | Position 2 |             |             |
| 3      | Position 3 | 2           | S           |

如您在TPSTAFFPOS中看到的,pos_cllvlid可以为null。我尝试执行的所有操作均会遇到相同的错误,“表TPSTAFFPOS中列'pos_cllvlid'的值是dbnull。”

1 个答案:

答案 0 :(得分:0)

假设pos_cllvlid字段可以保存null的值,则Select中的最终Group Join语句应如下所示:

        Select New With _
        {
            pos.pos_id,  _
            pos.pos_name,  _
            pos.pos_cllvlid,  _
            cl?.cltype_value
        }) _
         .Distinct() _
         .ToArray()

        Select pos, cl?.cltype_value) _
         .Distinct() _
         .ToArray()

如您所见,我已经使用?来防止NullReferenceException。左外部联接的左侧是所有数据,而当没有相关数据时,右侧将返回nullNothing)。因此,在尝试右边的数据之前,必须检查nullNothing)。

如MSDN所述,?运算符...

测试之前的左侧操作数的值是否为null(Nothing) 执行成员访问(?。)或索引(?())操作;退货 如果左侧操作数的计算结果为Nothing,则为Nothing。注意在 通常返回值类型的表达式,空条件 运算符返回一个Nullable。

有关更多详细信息,请参见:?. and ?() null-conditional operators (Visual Basic)