实体框架包含命令 - 左连接还是内连接?

时间:2013-09-15 07:04:43

标签: c# linq entity-framework .net-4.0 linqpad

当我调查IncludeJoin之间的区别时,我发现:

如果数据库没有包含外键 - 它没有导航道具,所以最好使用Join

如果 有导航道具 - 那么请使用Include。 (它还可以节省数据库命中率。)

但有一个answer here引起了我的注意:

  

Include实现为连接。 取决于可空性   包含链接,它是内部加入。

问题:

无效如何影响左/内连接?

在Sql server中,我可以有一个Cities表和Persons表,一个人可以拥有NULL CityID

为什么实体框架会为我决定它是什么类型的联接?

编辑:可视化:

enter image description here

enter image description here

现在让我们将CityId更改为非null:

enter image description here

这是改变:

enter image description here

2 个答案:

答案 0 :(得分:13)

假设您的班级对City或CityID存在[Required]约束。并且假设没有(有效)城市的人员记录。满足[Required]的唯一方法是执行内连接。

但只要你的Db和模型中的约束匹配(即CityID INT NOT NULL),使用何种类型的连接就不重要了。这应该是正常情况。

如果没有约束,你当然会期待一个左连接。

答案 1 :(得分:5)

我知道这是一个老问题,但如果有人像我一样使用 EF Code First 来到这里,我的问题在于流利的映射:

["M", "A", "M", "I", "M", "P"]

被翻译为 LEFT OUTER JOIN

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Parent>()
            .HasOptional(a => a.Child) /* LEFT OUTER JOIN */
            .WithMany()
            .HasForeignKey(a => a.ChildId);
    }

被翻译为 INNER JOIN