【问题标题】:Entity framework Include command - Left or inner join?实体框架包含命令 - 左连接还是内连接?
【发布时间】:2013-09-19 12:41:15
【问题描述】:

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

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

如果它确实有导航道具 - 然后使用Include。 (它还保存了一个数据库命中。)

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

Include 被实现为连接。 取决于可空性 包含的链接是 innerleft 连接。

问题:

nullity 如何影响左/内连接?

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

为什么实体框架会为我决定它是什么样的加入?

编辑:可视化:

现在让我们将 CityId 更改为不为空:

这是变化:

【问题讨论】:

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


    【解决方案1】:

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

    但只要您的 Db 和模型中的约束匹配(即CityID INT NOT NULL),使用哪种 Join 并不重要。这应该是正常情况。

    如果没有约束,您当然会期望左连接。

    【讨论】:

    • 我目前没有任何可以添加的项目 [必需] 我只是使用 linqpad 并添加了 Include (Linq)。 linqpad 向我展示了基于 nullity 的 Left jOin / Inner Join。这就是我的问题。为什么。
    • 哪个空能力,如何?
    • 对我来说似乎很清楚。尝试想象其他组合,尤其是 Not Null 和 Left join -> 无效对象。
    • 咳咳,想来想去,还是觉得很有道理。
    • 在某些情况下需要 LEFT JOIN 而不是 INNER JOIN。我有公司实体,它有联系方式,有地址,有地区。区域是可选的(可为空)。每当我查询包括联系人、地址和地区在内的所有公司时,我只得到那些地址有地区的公司。我想要所有没有区域的公司。为什么 EF 强制我在需要 LEFT JOIN 的地方使用 INNER JOIN?我不想使用 DefaultIfEmpty,创建一个与我的公司实体相同的新匿名实例并手动复制每个属性,因为结果是公司
    【解决方案2】:

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

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Entity<Parent>()
                .HasOptional(a => a.Child) /* LEFT OUTER JOIN */
                .WithMany()
                .HasForeignKey(a => a.ChildId);
        }
    

    被翻译为 LEFT OUTER JOIN

        modelBuilder.Entity<Parent>()
            .HasRequired(a => a.Child) /* INNER JOIN */
            .WithMany()
            .HasForeignKey(a => a.ChildId);
    

    被翻译为INNER JOIN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-16
      • 2011-07-29
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多