4

这是我正在使用 .NET 4.0 在 Entity Framework 5.0.0 RC(代码优先)中处理的查询

我是 Entity Framework 的新手,所以我仍然在思考如何构建查询,特别是在选择“子”相关数据方面。

我正在使用“急切加载”,因此我可以一次获取所有相关数据。但是我遇到了一个问题,并不是所有的 Drops 都被检索到了。

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 查询中,客户被 INNER JOINED 到 Drops,因此不包括没有客户的 Drops。

那么如何让它在这两个实体之间进行 LEFT JOIN 呢?

.Include 似乎做左连接 - 那么为什么不 .Select 呢?

除了 .Select 之外,还有其他方法可以用来执行 LEFT JOIN 吗?


更新

与 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 类型且不可为空的 int 类型,因此 Drop.CustomerID 与客户内部连接(在聊天中查看)。

于 2012-07-26T13:31:27.650 回答