使用VB.NET和LINQ左外连接null

时间:2010-09-27 15:30:16

标签: vb.net linq left-join

我认为我的工作是左外连接LINQ查询,但由于连接右侧的空值,我遇到了选择问题。这是我到目前为止所拥有的

 Dim Os = From e In oExcel
        Group Join c In oClassIndexS On c.tClassCode Equals Mid(e.ClassCode, 1, 4)
        Into right1 = Group _
        From c In right1.DefaultIfEmpty

我想返回e的所有内容和c中名为tClassCode的一列。我想知道语法是什么。如您所见,我正在使用VB.NET

更新...

这是在我收到错误时进行连接的查询:

  

_message =“对象引用未设置为对象的实例。”

 Dim Os = From e In oExcel
             Group Join c In oClassIndexS On c.tClassCode Equals Mid(e.ClassCode, 1, 4)
             Into right1 = Group _
             From c In right1.DefaultIfEmpty
        Select e, c.tClassCode

如果从select中删除c.tClassCode,则查询运行时没有错误。所以我想也许我需要做一个新的选择,但我不认为我也是这样做的。

2 个答案:

答案 0 :(得分:3)

编辑:您需要检查c是否为null,特别是分组后的c。请参阅下面的我的更新。

您需要在select语句中对 tClassCode c进行空检查。 tClassCode是什么类型的?您应该能够对 c进行空检查,如果它为null,则转换为相应类型的可空值并返回它,否则返回实际值。 < / p>

由于我不确定tClassCode是什么让我们假设它是一个整数,在这种情况下,强制转换为可以为空的整数(Integer?)。考虑到这一点,你的select语句将在你到目前为止的最后添加,应该类似于:

由于tClassCode是一个字符串,因此您的代码类似于:

Select _
    e, _
    Code = If(c Is Nothing, Nothing, c.tClassCode)

如果c为空,您可以返回String.Empty而不是Nothing,具体取决于您需要执行的操作:

Select _
    e, _
    Code = If(c Is Nothing, String.Empty, c.tClassCode)

当然,您可以自由地进一步扩展“e”的选择,以按名称投射其特定列。

要认识到的重要一点是,在使用任何属性之前必须检查c是否为null,因为它可能为null,具体取决于特定结果(行)的左外连接结果。回到我之前的例子,如果你有一个名为Priority的另一个字段,它是一个整数,你可以对可空的字符串进行投射:

Select _
    e, _
    Priority = If(c Is Nothing, CType(Nothing, Integer?), c.Priority)

答案 1 :(得分:1)

嗯,我得到了它...至少我得到的结果没有错误。谢谢你的帮助......在这里。

 Dim Os = From e In oExcel
                 Group Join c In oClassIndexS On c.tClassCode Equals Mid(e.ClassCode, 1, 4)
                 Into right1 = Group _
                 From jo In right1.DefaultIfEmpty()
        Select New With {.CivilServiceTitle = e.CivilServiceTitle, .Code = If(jo Is Nothing, Nothing, jo.tClassCode)}