在LINQ方法语法中使用左连接

时间:2015-01-02 09:20:23

标签: vb.net linq left-join

我有两个表:t1t3,我有以下sql查询:

select t1.*, t3.* from t1 left join t3 on t1.f1=t3.f1

t1包含30k条记录,t3只有10条。匹配字段为f1

t1有5个字段,t3有2个字段。

通过上面的查询,我得到了30k记录+10个字段值,如下所示:

t1.f1, t1.f2, t1.f3, t1.f4, t1.f5, t3.f1, t3.f2

记录是这样的,只有前10条记录才有匹配。因此,t3.f1t3.f2为空值。

现在,我想在LINQ中编写一个查询,产生这个结果:

Dim JoinedResult = LeftTable.GroupJoin(RightTable, Function(LeftTableRow) LeftTableRow(FieldIndexInLeftTable), _
                                                             Function(RightTableRow) RightTableRow(FieldIndexInRightTable), _
                                                             Function(LeftTableRow, RightTableRow) New With {LeftTableRow, RightTableRow.DefaultIfEmpty(Function(Item) IIf(Item Is Nothing, Nothing, Item))})

如你所见,我试图告诉LINQ,如果RightTableRow中的任何项目为空,那么在这种情况下我也需要字段值,并且值为空。

但vb说:匿名类型成员名称只能从没有参数的简单或限定名称推断出来。

重要的是,表t3的字段可以是各种各样的,因此为t3.f1t3.f2定义空值不是一种选择。如果没有匹配的记录,我需要为t3中的所有字段定义一个空值(null)。

可能在t3t1中的行匹配记录更多,所以我也必须使用SelectMany,但是如何?

感谢。

编辑:

Dim JoinedResult = LeftTable.GroupJoin(RightTable, Function(LeftTableRow) LeftTableRow(FieldIndexInLeftTable), _
                                     Function(RightTableRow) RightTableRow(FieldIndexInRightTable), _
                                     Function(LeftTableRow, RightTableRow) _
                                     New With {LeftTableRow, RightTableRow}). _
                                     SelectMany(Function(Row) _
                                     Row.RightTableRow.DefaultIfEmpty().Select(Function(RightT) _
                                                                                  New With {Row.LeftTableRow, _
                                                                                            Key .rt = RightT.Select(Function(Item) IIf(Item Is Nothing, String.Empty, Item)).ToArray}))

有了这个错误消息消失,但我在运行时得到一个null异常,这是obv。事实证明,除了前10个记录之外,RighT是空的。

1 个答案:

答案 0 :(得分:0)

你应该看看这个链接:

http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx

您的代码应该遵循:

var query =
   from left in LeftTable
   join right in RightTable on right.FieldIndexInRightTable equals  left.FieldIndexInLeftTable
    into gj
    from subpet in gj.DefaultIfEmpty()
    select new {Your fields };