我正在尝试使用类似于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。”
答案 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
。左外部联接的左侧是所有数据,而当没有相关数据时,右侧将返回null
(Nothing
)。因此,在尝试右边的数据之前,必须检查null
(Nothing
)。
如MSDN所述,?
运算符...
测试之前的左侧操作数的值是否为null(Nothing) 执行成员访问(?。)或索引(?())操作;退货 如果左侧操作数的计算结果为Nothing,则为Nothing。注意在 通常返回值类型的表达式,空条件 运算符返回一个Nullable。
有关更多详细信息,请参见:?. and ?() null-conditional operators (Visual Basic)