这是我正在使用 .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() 必须有一些类似的行为,但不,它只是遵守模型的配置方式:)