以下是我在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与客户内部连接。