45

linqのjoinを使用して2つのテーブルを結合しました。結合と包含の違いは何ですか。私が見るところ、どちらも同じように動作します。

    Include vs. Join
4

3 に答える 3

49

Includedは、元のオブジェクト構造とグラフを保持することを目的としています。結合は、オブジェクトグラフのフラット化された表現を投影するため、またはグラフを介して自然に関連しないタイプを結合するために必要です(つまり、顧客の都市と配送施設の都市を結合します)。

以下を比較してください db.Customers.Include("Orders") 。IEnumerableを生成します。各IEnumerableには、次のようなオブジェクトグラフに対応する注文のリストが含まれている場合があります。

Customer 1
   Order
   Order
   Order
Customer 2
   Order
   Order

対照的に、匿名タイプに投影する結合で同じことを行うと、次のようになります。

    from c in db.Customers 
    join o in db.Orders on c.CustomerId equals o.CustomerId 
    select new {c, o}

これにより、IEnumerable<Anonymous<Customer, Order>>注文ごとに顧客が繰り返される新しいものが作成されます。

{ Customer1, orderA }
{ Customer1, orderB }
{ Customer1, orderC }
{ Customer2, orderD }
{ Customer2, orderE }
{ Customer2, orderF }

どちらもデータベースに同じリクエストを発行する場合がありますが、結果のタイプはまったく異なる場合があります。

于 2012-09-05T18:22:44.460 に答える
15

ある意味、そうです。インクルードは結合として実装されます。含まれているリンクのnull可能性に応じて、内部結合または左結合になります。

次のように、結合を使用して、いつでも自分でインクルードを作成できます。

db.Users.Select(u => new { u, u.City })

これは、ユーザーの都市の「インクルード」です。これは、SQL結合として現れます。

于 2012-09-05T15:27:36.973 に答える
4

あなたが単にOrdersいくつかのためにすべてを必要とするならばCustomers。ここでのブログアプリケーションの良い例は、Comments以下のすべてをArticles常に表示することです。それIncludeがあなたの働き方です。

Joinいくつかが必要で、エンティティCustomersに含まれているデータを使用してそれらを除外する場合は、反対の方がより役立ちます。Ordersたとえば、下品な言葉を含むArticles警察に送るために整理したいとします。ArticlesComments

また、Ordersエンティティに大量のデータ(多くの列)が含まれていて、大量のメモリを使用していて、それらすべてを必要としない場合は、joinはるかに効率的ですが、ここでは常に「大量のデータ」または「多くの列」が問題になります。つまり、最初にテストするのが最良の選択です。

于 2020-08-31T04:45:57.900 に答える