随后的两个FROM子句被转换为对SelectMany
.
一种)
var query = from c_1 in collection_1
from c_2 in collection_2
from c_3 in collection_3
select ...
如果我错了,请纠正我,但我认为查询表达式被翻译成语义上等同于的代码:
collection_1.SelectMany(c_1 => c_1.collection_2.
SelectMany(c_2 => c_2.collection_3.
Select(c_3 => ... )));
总是from c_3 in collection
“绑定”到c_2
范围变量吗?使用“绑定”一词,我在问是否collection_3
为每个元素枚举了整个c_2
元素?
b) 假设我在a)下是正确的,c_3
总是“绑定”到最接近它定义的范围变量?
c) 如果对b)的回答为真,那么在以下示例中c_3
也必然:c_2
var query = from c_1 in collection_1
from c_2 in collection_2
where ...
from c_3 in collection_3
d)在下一个查询中c_3
绑定到a
(即,对于每个a
整体groupAandB
都将被枚举):
var query_1 = from a in groupA
join b in groupB on a equals b
into groupAandB
from c_3 in groupAandB
select c_3;
e) 在这里,我假设d)的答案c_3
确实是a
. 但是当查看在query_1
编译时被翻译成的代码时,我们可以争辩说它c_3
实际上是绑定到匿名类型a_1
( ie new { a, groupAandB = os }
)的?!
groupA.GroupJoin(groupB, a => a, b => b, (a, os) => new { a, groupAandB = os } ).
SelectMany(a_1 => a_1.groupAandB );
f) 牢记要query_1
翻译的内容,我们不能争辩说我在d)下所做的任何假设在概念上可能是正确的,但在技术上是错误的,因为在编译时没有任何c_3
变量,或者可能在c_3
某处定义在引擎盖下,但它实际上绑定到匿名类型而不是a
?
编辑:
1)
使用 Join,“第二个”集合不能依赖于您当前正在“查看”第一个集合中的哪个值,
a)我假设你的意思是我们不能加入由当前值返回customers
的集合(即) :c.Orders
c
var query1 = from c in customers
join o in c.Orders on c.CustomerId equals o.OrderID // this won't work
select new { c.Name, o.OrderID, o.OrderDate };
b)顺便说一句,为什么不允许这样的加入(我假设进行这样的加入在技术上是可行的)或者为什么它没有意义?
2)
“C# 规范给出了所涉及的显式转换”
您能否详细说明“涉及的显式转换”的含义以及它与e)和f)问题的关系?
谢谢你