我认为我的工作是左外连接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,则查询运行时没有错误。所以我想也许我需要做一个新的选择,但我不认为我也是这样做的。
答案 0 :(得分:3)
编辑:您需要检查c
是否为null,特别是分组后的c
。请参阅下面的我的更新。
您需要在select语句中对 tClassCode
c
进行空检查。 < / p>
tClassCode
是什么类型的?您应该能够对值 c
进行空检查,如果它为null,则转换为相应类型的可空值并返回它,否则返回实际值。
由于我不确定 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)}