asp.net – 实体框架 – 使用.Include()和.Select()的“eager loading” – 如何使用LEFT JOIN而不是INNER JOIN?

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

我是实体框架的新手,所以我仍然关注如何构建查询,特别是在选择“子”相关数据时.

我正在使用“急切加载”,因此我立即获得所有相关数据.但我遇到的问题是并非所有的Drop都被检索到了.

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查询中,客户正在内联到Drops,因此排除了没有Customer的Drops.

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

.Include似乎做左连接 – 所以为什么不.选择?

有没有其他方法.选择我可以使用哪种方法进行LEFT JOIN?

UPDATE

在与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()必须有一些类似的行为,但不是它只是遵守模型的配置:)

最佳答案 Drop是内部与客户联系的,因为Drop.CustomerID的类型为int而不是nullable int(在聊天中查找).

点赞