これは、Entity Framework 5.0.0 RC (コードファースト) と .NET 4.0 で取り組んでいるクエリです。
私はEntity Frameworkを初めて使用するので、特に「子」関連データの選択に関して、クエリを構造化する方法についてまだ頭を悩ませています。
「一括読み込み」を使用しているため、関連するすべてのデータを一度に取得します。しかし、ドロップのすべてが取得されていないという問題があります。
var loads = context.Loads
.Include(
p => p.Device
)
.Include(
p => p.Drops.Select(
a => a.Customer
)
).Include(
q => q.Drops.Select(
b => b.Items.Select(
c => c.Product
)
)
).Where(
u => u.Id.Equals(id)
);
問題は、生成された SQL クエリで Customers が Drops に INNER JOINED されているため、Customer を持たない Drops が除外されていることです。
では、これら 2 つのエンティティ間で LEFT JOIN を実行するにはどうすればよいでしょうか。
.Include は左結合を行うように見えます。
LEFT JOIN を実行する .Select 以外の方法はありますか?
アップデート
Amiram とチャットした後、Drop モデルの設定が間違っていたことに気付きました。CustomerID 列をオプションに設定する必要がありました。
public class Drop
{
public int Id { get; set; }
public int? CustomerId { get; set; }
public int LoadId { get; set; }
public DateTime Date { get; set; }
public virtual Customer Customer { get; set; }
public virtual ICollection<DropItem> Items { get; set; }
}
私はすぐにこれを考えるべきでしたが、正直なところ、モデルの関係のカーディナリティに関係なく、.Include() が常に LEFT JOIN を実行するという事実に気が進まなかったのです。私は .Select() も同様の動作をしなければならないと考えていましたが、モデルの構成方法に従っているだけでした:)