实体框架 - "eager loading"使用 .包括 () 和 .Select() - 如何使用左连接而不是内部连接?



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

我是实体框架的新手,所以我仍然在思考如何构建查询,尤其是选择与"子"相关的数据。

我使用的是"热切加载",所以我可以一次获得所有相关数据。但我遇到了一个问题,不是所有的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查询中,Customers被INNER联接到Drops,从而排除了没有Customer的Drop。

那么,我如何使它在这两个实体之间进行左联接呢?

.Include似乎用于左联接-为什么不呢。选择?

除了.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()一定有一些类似的行为,但不,它只是服从模型的配置:)

由于Drop.CustomerID的类型为int,不可为null(请查看聊天),因此Drop与客户内部连接。

相关内容

  • 没有找到相关文章

最新更新