我有两个表:t1
和t3
,我有以下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.f1
和t3.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.f1
和t3.f2
定义空值不是一种选择。如果没有匹配的记录,我需要为t3
中的所有字段定义一个空值(null)。
可能在t3
中t1
中的行匹配记录更多,所以我也必须使用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是空的。
答案 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 };