後続の 2 つのFROM句は、への呼び出しに変換されSelectMany
ます。
a)
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)に対する答えが true の場合、次の例では偶数に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
(つまりnew { a, groupAandB = os }
)にバインドされていると主張できます。
groupA.GroupJoin(groupB, a => a, b => b, (a, os) => new { a, groupAandB = os } ).
SelectMany(a_1 => a_1.groupAandB );
f) 何が翻訳されるかを頭に入れておくと、d)query_1
の下で行った仮定はおそらく概念的には正しいが、技術的には間違っていると主張できませんか?コンパイル時には変数がないか、おそらくどこかに定義されているからです。ボンネットの下ですが、実際には匿名型にバインドされており、 ?にはバインドされていません。c_3
c_3
a
編集:
1)
Join を使用すると、「2 番目の」コレクションは、最初のコレクションから現在「見ている」値に依存できなくなります。
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)の質問にどのように関係するのか詳しく説明していただけますか?
ありがとうございました