2017-11-01 3 views
0

以下のコードでは、左外部結合の結果(なぜなら、dはco.DefaultIfEmpty(emptyOrder)から返されたテーブルの要素であるco.DefaultIfEmpty(emptyOrder)のdのようになります)don CustomersとOrdersの両方のプロパティを含むのではなく、Ordersのプロパティのみを含んでいます。 顧客と注文の情報にアクセスするために、必要な情報c.cとc.dを表示するために2つの変数を使用しています。 c.c.CompanyNameをc.d.CompanyNameに置き換えた場合、コンパイラはCompanyNameがOrderであるc.dのプロパティではないと言います。私が理解していないのは、顧客と注文に参加することで得られたテーブルの要素であるとは思われないのですか?なぜ、得意先と受注の両方から1つのテーブルに列が表示されるSQLのように、CustomersとOrdersの両方のプロパティが含まれていないのですか?左外部結合の要素は、table1の列とtable2の列を持つとは限りませんか?

var query11 = from c in CustomerList 
         where c.Country == "USA" 
         join o in OrderList 
          on c.CustomerID equals o.CustomerID into co 
         from d in co.DefaultIfEmpty(emptyOrder) 
         select new { c, d }; 

foreach (var c in query11) { 
       sbResult.Append(String.Format("CustID = {0}, Name = {1}, 
       OrderID = {2}, OrderDate = {3:d}\r\n", 
        c.c.CustomerID, c.c.CompanyName, c.d.OrderID, 
        c.d.OrderDate)); 
} 
+0

「emptyOrder」とは何ですか? –

+0

Customersに一致するOrdersがない場合は、null値を置き換えるのはデフォルトのオブジェクトです。 –

答えて

0

あなたが見ているのは正常です。 LINQ全体の質量は左外部結合です。マウスをcoの上に置くと、タイプはIEnumerable<Order>(またはOrderListのアイテムクラスの名前が何であっても)です。

LINQ left outer join techniqueall examplesの「匿名タイプ」は、「左テーブル」オブジェクトと「右テーブル」オブジェクトで匿名タイプを返します。そうでなければ、それぞれからさまざまな特性が引き出される。 SQLの場合と同様に、結果セットのフィールドは選択したものによって決まります。

select new { c, d }select new { c.CustomerID, c.CompanyName, d.OrderID, d.OrderDate }に変更し、ループのクリーンな匿名タイプを取得できます。

+0

しかし、dがco.DefaultIfEmpty()の返り値の要素である場合、dはOrder項目のみを表します。ジョインから得られた結果テーブルはありませんか? –

+0

マウスの上にマウスを置きます。 co.DefaultIfEmpty()はOrderを返します。注文の列挙には他に何もありません。これがLINQでの結合の仕組みです。 LINQ参加の設計の背後にある考え方をMicrosoftから説明してもらうだけの人がいれば、あなたの質問でそう言いましょう。あなたが探しているものに対処できない場合は、私の答えを削除します。 –

+0

あなたの答えはとても役に立ちました。理解しなければならないのは、DefaultIfEmpty()が返すものだけです。 DefaultIfEmpty()関数は、右側の表(この例では各顧客のOrderList)にあるNULLをチェックし、デフォルトのnullを持つOrdersのすべてのシーケンスを戻します。あなたが私に提供したmsdnリンクは、「この例では、一致するPetオブジェクトの各シーケンスでDefaultIfEmptyが呼び出されます」という質問に回答しました。私たちはPersonコレクションに外部コレクションを残したところで、Petコレクションを使用しました。 –

関連する問題