私はMS101Linqの例をコーディングしていますが、結合によってループが発生します;)
例104は、少し複雑なグループ結合がどのように機能するかを示すことを目的としています。
var prodByCategory =
from cat in categories
join prod in products on cat equals prod.Category into ps
from p in ps // <-- ?
select new { Category = cat, p.ProductName };
「?」のある部分 pはpsとまったく同じもののように見え、その句は前の例にはないため、私は混乱します。
そこで、method / linq構文を使用して記述しようとしましたが、まとめると次のようになります。
var prodByCategory = categories.GroupJoin(products, c => c, p => p.Category, (c, p) => new { Category = c, p.First().ProductName });
First()の呼び出しは、以前のクエリ式に含まれていないため、混乱します。
これを実行すると、最初に到達する前にpが空であるため、エラーが発生します。カテゴリリストは製品コレクションのカテゴリと完全に一致しているため、それがどのように可能かはわかりません。
foreach (var item in prodByCategory)
{
Console.WriteLine(item.ProductName + ": " + item.Category);
}
製品にはすでにカテゴリフィールドがあります。では、クエリは何が良いのでしょうか?これは単なる学習であると思いますが、ここでの価値を理解するのに苦労しています(ただし、2つのコレクションがどのように関連しているかがわからないためかもしれません)。
アップデート:
ガートの提案で遊んだ。以下の彼の明確な説明を参照してください。マイナーなクリーンアップの後、これは機能しました:
var prodByCategory = categories.GroupJoin(products, cat => cat, prod => prod.Category,
(cat, prod) => new { cat, products })
.SelectMany(x => x.products
, (x, p) =>
new
{
Category = x.cat, // x.cat.CategoryName not accessible here
ProductName = p.ProductName
});