4

これは、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() も同様の動作をしなければならないと考えていましたが、モデルの構成方法に従っているだけでした:)

4

1 に答える 1

2

Drop.CustomerID は int 型であり、nullable int ではないため、ドロップは顧客と内部結合されます (チャットを見てください)。

于 2012-07-26T13:31:27.650 に答える