Linq“into”关键字混淆

Linq“into”关键字混淆,linq,Linq,我正在查看同事的Linq查询,如下图所示,查询执行正确: from ea in EquipmentApplication join erl in EquipmentRoutingLocation on ea.EquipmentID equals erl.EquipmentID into erlWithNulls from erlAll in erlWithNulls.DefaultIfEmpty() join rl in RoutingLocation on erlAll.RoutingLoc

我正在查看同事的Linq查询,如下图所示,查询执行正确:

from ea in EquipmentApplication
join erl in EquipmentRoutingLocation on ea.EquipmentID equals erl.EquipmentID into erlWithNulls

from erlAll in erlWithNulls.DefaultIfEmpty()
join rl in RoutingLocation on erlAll.RoutingLocationID equals rl.RoutingLocationID into rlWithNulls

from rlAll in rlWithNulls.DefaultIfEmpty()
where ea.Equipment.Master_Cell.Area.Unit.UnitID == 1160
select new { ea.Equipment, ea.ApplicationFriendlyName, rlAll }
我不明白为什么会这样。我的理解可能是错误的,“into”关键字结束了当前范围/上下文,创建的任何变量现在都超出了范围并创建了一个新变量。如果这是真的,为什么“ea”变量仍在查询的最后一部分的作用域中?

与select关键字一起使用时,into将结束作用域。
与join关键字一起使用时,into将添加一个包含join中所有匹配项的变量。这被称为进入有两种不同的含义:

在join子句中,它将转换从使用join更改为GroupJoin。这意味着不是每个匹配对都得到一个结果,而是原始序列的每个元素都得到一个结果,并且该结果作为一个组包含键和来自另一个序列的所有结果。有关更多详细信息,请参阅 在select或group…中,它将成为一个,有效地使用新范围变量中旧查询的结果启动新查询。
为了补充前面已经说过的内容,我想演示一下导入与不导入所产生的对象结构的差异:

var q = 
    from c in categories 
    join p in products on c equals p.Category into ps 
    select new { Category = c, Products = ps }; 
创建对象图:

Category 1, Products:
  Product 1
  Product 2
Category 2, Products:
  Product 3
  Product 4
在本例中,q仅包含两个项目,即两个类别

如果不使用into,您将获得一个更传统的连接,它通过创建所有可能的组合使关系变得平坦:

var q = 
    from c in categories 
    join p in products on c equals p.Category 
    select new { Category = c, Product = p }; 

Category 1, Product 1
Category 1, Product 2
Category 2, Product 3
Category 2, Product 4
请注意,现在q包含4项

针对评论:

var q = 
    from c in categories 
    join p in products on c equals p.Category into ps 
    select new { Category = c, Products = ps.Select(x=> x.Id) }; 

在第一个示例中,不要选择整个产品1、2和3、4。您如何选择ID或产品1、2和3、4?@RayCheng我这里没有要测试的设置,但我发布了另一个可能有效的代码片段,您可能需要添加ToList ps.select-。ToList链接查询继续不再有效!因此,当您使用多个联接时,您是否使用'into'子句并使用刚才添加的'variable'联接下一个查询?