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

问题描述 投票:0回答:1

我正在尝试使用类似于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。”

vb.net linq linq-to-sql
1个回答
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)

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.