这是我正在使用.NET 4.0在Entity Framework 5.0.0 RC(代码优先)中处理的一个查询实体框架 - “使用.Include()和.Select()加载” - 如何使用LEFT JOIN而不是INNER JOIN?
我是新来的实体框架,所以我仍然在围绕如何构造查询,特别是围绕选择“儿童”相关数据。
我正在使用“急切加载”,因此我一次获得所有相关数据。但是我遇到了一个问题,那就是并不是所有的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查询,该客户正在INNER连接在下降,从而排除不具有客户下降。
那么如何让它在这两个实体之间做一个左连接?
。包含似乎做左连接 - 所以为什么不。选择?
是否有一种方法,而不是。选择我可以使用哪个将做一个左连接?
UPDATE
与阿米拉姆聊天后,我意识到,我已经把我丢弃型号最多不正确。我需要设置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()必须有一些类似的行为,但没有它只是服从如何配置模型:)
如果你写p => p.Drops.Select(a => a.Customer).DefaultIfEmpty() – 2012-07-26 07:52:54
@AmiramKorach - 我得到一个错误:*包含路径表达式必须引用定义的导航属性方式。使用虚线路径作为参考导航属性,Select运算符用于收集导航属性 参数名称:path * – asgeo1 2012-07-26 10:53:50
因为你的问题非常有趣,我现在用相同的表格试了一下,一切正常。即使没有客户,也会加载放置。我没有先使用代码,而是先使用数据库。 – 2012-07-26 11:21:14