这是我正在使用.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(在聊天中查找).