質問: 私は自分の質問が単純であると信じています(回答が正しいかどうかは分かりません): Entity Frameworkに "LEFT OUTER JOIN"ではなく "INNER JOIN"をデフォルトの規約として使用させる方法を知っていますか?
回答: 明示的に内部または外部ジョインを強制したい場合は、常に`Join`メソッドまたは`GroupJoin`メソッドを使用できます。 (または包括的な同等のもの`join` `join ... into` ) `join ... into` 。 しかし、一般的に言えば、LINQステートメントでは、明示的な結合ステートメントの使用を避けるべきです。代わりに**ナビゲーションプロパティ**を使用してください。ナビゲーションプロパティは、エンティティ間で定義された**関連付け**です。ナビゲーションプロパティによるクエリは、手作業でコーディングしないでジョインでクエリを実行することです。しかし、いつこれらの結合は内側か外側かですか? これらの3つの簡単なクラスを取る: ``` class Product { public int Id { get; set; } public string Name { get; set; } public int CategoryId { get; set; } public Category Category { get; set; } public int? PhotoId { get; set; } public Photo Photo { get; set; } } class Category { public int Id { get; set; } public string Name { get; set; } public ICollection Products { get; set; } } class Photo { public int Id { get; set; } public byte[] Image { get; set; } } ``` カテゴリや写真を含む商品を検索するとどうなりますか? ``` context.Products.Include(p => p.Category).Include(p => p.Photo) ``` Entity Frameworkは、アソシエーションの*カーディナリティ*を調べて、好ましい内部結合または外部結合を生成できるかどうかを判断します。 * 必要な関連付けが内部結合を生成します。 * オプションのアソシエーションは外部結合を生成します。 この場合、 `Product`と`Category`間の内部結合と、 `Product`と`Photo`外部結合が`Product`ます。 私はこれが賢明な選択だと思う。結果セットに写真を含めると、取り出したアイテムの数が突然減少するというのは予期しない動作です。 同じことが他のクエリシェイプにも当てはまります ``` context.Products.Select(p => new { p.Name, Cat = p.Category.Name }) ``` これにより、内部結合が生成されます。 ``` context.Products.Select(p => new { p.Name, Cat = p.Photo.Image }) ``` これにより、外部結合が生成されます。 後者の例で`Photo != null`商品のみを照会すると、内部結合が生成される可能性があり`Photo != null` 。これは明示的なLINQ結合を作成したい場合です。 結論 だから、このナビゲーションの特性に焦点を当ててあなたの注目をシフト... > Entity Frameworkで強制的に "INNER JOIN"を使用する方法 > > ...ビジネスロジックに関連する決定を、関連付けが必要かどうかにかかわらず選択できるようにする。