加入Linq

时间:2009-12-13 16:20:13

标签: c# linq

当我宣布

 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行?

2 个答案:

答案 0 :(得分:1)

1)你正在做group join。对于g中的每个元素,IGrouping将为ag.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匹配的元素。