当我宣布
时 int[] a = { 1, 2 ,10,30};
int[] b = { 10, 20, 30 };
var q = from item1 in a
join item2 in b
on item1 equals item2
into g
select g
1)实际上被选中的是什么?很难理解into
关键字。如果您举例解释关键字"into"
,我会很高兴。
2)
How do the following code actually projected ?
1 from a in db.coll1
2 join b in db.coll2 on a.PK equals b.PK into b_join
3 from b in b_join.DefaultIfEmpty()
4 where
5 b.PK == null
6 select new {
7 a.PK,
8 a.Value,
9 Column1 = (System.Int32?)b.PK,
10 Column2 = b.Value
}
在第2行,我们使用“b”来选择项目 在第3行中我们也使用相同的b,这是否意味着我们覆盖了我们选择的数据 在第2行?
答案 0 :(得分:1)
1)你正在做group join。对于g
中的每个元素,IGrouping
将为a
。 g.Key
将是来自a
的元素,g
(实现IEnumerable
)将包含来自b
的所有匹配元素。要完全理解这一点,请在LINQPad中进行试用。另请阅读documentation。
2)into
关键字将第一个b
合并到b_join
,如上所述,它将是IGrouping
。之后,第一个b
不再在范围内。
答案 1 :(得分:0)
如果在编译代码上使用.NET Reflector,则可以看到第一个查询等同于以下内容:
IEnumerable<IEnumerable<int>> q = a.GroupJoin(b,
item1 => item1,
item2 => item2,
(item1, group) => group);
请注意,您正在执行组加入,但仅返回组。将此与普通联接进行比较:
IEnumerable<int> q = a.Join(b,
item1 => item1,
item2 => item2,
(item1, item2) => item2);
如果存在任何此类元素,则返回b中与每个a匹配的元素。