linqのjoinを使用して2つのテーブルを結合しました。結合と包含の違いは何ですか。私が見るところ、どちらも同じように動作します。
Include vs. Join
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 }
どちらもデータベースに同じリクエストを発行する場合がありますが、結果のタイプはまったく異なる場合があります。
ある意味、そうです。インクルードは結合として実装されます。含まれているリンクのnull可能性に応じて、内部結合または左結合になります。
次のように、結合を使用して、いつでも自分でインクルードを作成できます。
db.Users.Select(u => new { u, u.City })
これは、ユーザーの都市の「インクルード」です。これは、SQL結合として現れます。
あなたが単にOrders
いくつかのためにすべてを必要とするならばCustomers
。ここでのブログアプリケーションの良い例は、Comments
以下のすべてをArticles
常に表示することです。それInclude
があなたの働き方です。
Join
いくつかが必要で、エンティティCustomers
に含まれているデータを使用してそれらを除外する場合は、反対の方がより役立ちます。Orders
たとえば、下品な言葉を含むArticles
警察に送るために整理したいとします。Articles
Comments
また、Orders
エンティティに大量のデータ(多くの列)が含まれていて、大量のメモリを使用していて、それらすべてを必要としない場合は、join
はるかに効率的ですが、ここでは常に「大量のデータ」または「多くの列」が問題になります。つまり、最初にテストするのが最良の選択です。