我正在查看同事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 }
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么这样做.我的理解(可能不正确)是'into'关键字结束当前范围/上下文(并且创建的任何变量现在都超出范围)并创建一个新的.如果这是真的,为什么'ea'变量仍然在查询的最后部分的范围内?
Jon*_*eet 22
"into"有两个不同的含义:
join子句中,它将翻译从使用更改Join为GroupJoin.这意味着,不是每个匹配对获得一个结果,而是为原始序列的每个元素获得一个结果,并且该结果包含键和来自另一个序列的所有结果,作为一个组.有关Enumerable.GroupJoin详细信息,请参阅select或group...by它成为查询延续,有效地在新范围变量中使用旧查询的结果启动新查询.Aar*_*nLS 16
为了补充已经说过的内容,我想展示由into和without产生的对象结构的差异:
var q =
from c in categories
join p in products on c equals p.Category into ps
select new { Category = c, Products = ps };
Run Code Online (Sandbox Code Playgroud)
创建一个对象图:
Category 1, Products:
Product 1
Product 2
Category 2, Products:
Product 3
Product 4
Run Code Online (Sandbox Code Playgroud)
在这种情况下,q只包含2个项目,即两个类别.
如果没有,你会得到一个更传统的联接,通过创建所有可能的组合来平衡关系:
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
Run Code Online (Sandbox Code Playgroud)
请注意,现在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) };
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23962 次 |
| 最近记录: |