5

MS 101 Linq チュートリアルを使ってコーディングしています。

クエリをラムダ/メソッド構文 (およびその逆) にリファクタリングしようとしています。これは私にとって挑戦です。

指定されたクエリは次のとおりです。

var custSupQuery =
    from sup in suppliers
    join cust in customers on sup.Country equals cust.Country into cs
    select new { Key = sup.Country, Items = cs };

私はこのように書き直しました:

var custSupQuery = suppliers.Join(customers, s => s.Country, c => c.Country, (c, s) => new { Key = s.Country, Items = s, Items2 = c });

( new 句で両方のタイプのフィールドを組み合わせる簡単な方法が見つからなかったので、別々に残しました)。

これは、表示ループに到達するまでコンパイラと一緒に飛ぶようです。2 番目の foreach は型を処理できないようです。

表示コードは次のとおりです (クエリ式では機能しますが、ラムダ/メソッド構文では機能しません)。

foreach (var item in custSupQuery)
{
    Console.WriteLine(item.Key + ":");
    foreach (var element in item.Items)  // <-- error here
    {
        Console.WriteLine("   " + element.CompanyName);
    }
}

エラーは次のとおりです。

「JoinOperators.Program.Customer」には「GetEnumerator」のパブリック定義が含まれていないため、foreach ステートメントは「JoinOperators.Program.Customer」型の変数を操作できません

呼び出しでラムダ/クエリ構文を終了しようとしましたAsEnumerable()が、それでも同じエラーが発生します。匿名であるため、型として何を使用できるかわかりAsEnumerator<type_goes_here>ません。呼び出すことができるオブジェクトがないようですGetType()

助言がありますか?

4

1 に答える 1

5

join ... into構文は と同等ではなく、 とJoin同等ですGroupJoin。それはあなたが使用しなければならないものです:

var custSupQuery =
    suppliers.GroupJoin(customers, s => s.Country, c => c.Country,
                        (s, cs) => new { Key = s.Country, Items = cs });
于 2013-02-20T14:49:41.887 に答える