我正在查看一个同事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‘变量仍然在查询的最后一部分的作用域中?
发布于 2010-10-04 21:56:18
当与select
关键字一起使用时,into
将结束作用域。
当与join
关键字一起使用时,into
将添加一个变量,其中包含连接中的所有匹配项。(这称为Group Join)
发布于 2013-10-17 03:32:29
为了补充前面已经说过的内容,我想演示由into生成的对象结构与没有into生成的对象结构的差异:
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) };
https://stackoverflow.com/questions/3855881
复制相似问题