2012-07-26 55 views
4

这是我正在使用.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()必须有一些类似的行为,但没有它只是服从如何配置模型:)

+0

如果你写p => p.Drops.Select(a => a.Customer).DefaultIfEmpty() – 2012-07-26 07:52:54

+0

@AmiramKorach - 我得到一个错误:*包含路径表达式必须引用定义的导航属性方式。使用虚线路径作为参考导航属性,Select运算符用于收集导航属性 参数名称:path * – asgeo1 2012-07-26 10:53:50

+0

因为你的问题非常有趣,我现在用相同的表格试了一下,一切正常。即使没有客户,也会加载放置。我没有先使用代码,而是先使用数据库。 – 2012-07-26 11:21:14

回答

2

滴是内部加入客户,因为Drop.CustomerID的类型为int,而不是空的int(在聊天中看)。

+0

是的,我忘了让我的CustomerID列的类型为“诠释?” :哦,谢谢 – asgeo1 2012-07-26 13:42:39