当前位置: 首页 > 面试题库 >

为什么左外方加入?

焦宏硕
2023-03-14
问题内容

怪异的 (可能一点也不奇怪)

我有3个对象,即Employee,Rota和Department。

public class Employee
{
    public int Id { get; set; }
    public String Name { get; set; }
    public virtual Department Department { get; set; }
}

internal class EmployeeMapping : EntityTypeConfiguration<Employee>
{
    public EmployeeMapping()
    {
        HasKey(a => a.Id);
        Property(a => a.Id).HasColumnName("UserId");

        HasRequired<Department>(a => a.Department).WithOptional().Map(a => a.MapKey("DepartmentId"));
    }
}

public class Department
{
    public int Id { get; set; }
    public String Name { get; set; }
}

internal class DepartmentMapping : EntityTypeConfiguration<Department>
{
    public DepartmentMapping()
    {
        HasKey(a => a.Id);
        Property(a => a.Id).HasColumnName("DepartmentId");
    }
}

public class Rota
{
    public int Id { get; set; }
    public virtual Employee Employee { get; set; }
    public virtual Department Department { get; set; }
}

internal class RotaMapping : EntityTypeConfiguration<Rota>
{
    public RotaMapping()
    {
        HasKey(a => a.Id);
        Property(a => a.Id).HasColumnName("RotaId");

        HasOptional<Employee>(a => a.Employee).WithOptionalDependent().Map(a => a.MapKey("EmployeeId"));
        HasOptional<Department>(a => a.Department).WithOptionalDependent().Map(a => a.MapKey("DepartmentId"));
    }
}

并不复杂,真的。Rota可以分配一个员工和/或部门,所有这些都使用Fluent进行配置。我所有的关联都是正确的(架构是完美的),但是我有一个奇怪的怪异之处。

当我执行myContext.Departments.FirstOrDefault()并查看生成的SQL时,在Employee&Rota上有一个
LEFT OUTER JOIN 。为什么在那儿?
我不希望它这样做。也许我的Fluent映射不正确?我已经尝试了各种方法,但似乎无法弄清楚。如果我想要一个Rota对象,我会理解,它将加入该部门。但不是相反!

如果我这样做myContext.Departments.AsNoTracking().FirstOrDefault(),则不会执行 LEFT
OUTER JOIN的

有想法吗?


问题答案:

原因是映射不正确。看起来正确,但事实并非如此。使用这些代替:

internal class EmployeeMapping : EntityTypeConfiguration<Employee>
{
    public EmployeeMapping()
    {
        HasKey(a => a.Id);
        Property(a => a.Id).HasColumnName("UserId");

        HasRequired<Department>(a => a.Department).WithMany()
                                                  .Map(a => a.MapKey("DepartmentId"));
    }
}

internal class RotaMapping : EntityTypeConfiguration<Rota>
{
    public RotaMapping()
    {
        HasKey(a => a.Id);
        Property(a => a.Id).HasColumnName("RotaId");

        HasOptional<Employee>(a => a.Employee).WithMany()
                                              .Map(a => a.MapKey("EmployeeId"));
        HasOptional<Department>(a => a.Department).WithMany()
                                                  .Map(a => a.MapKey("DepartmentId"));
    }
}

创建数据库时,您的映射会正确解释,并且数据库看起来正确,但是EF认为您将所有关系一对一映射。这会使EF混淆,它将生成用于一对一创建内部实体引用的查询。当您告诉EF依赖实体是可选的时,这些一对左连接对于一对一关系是必需的-
EF除非加载它们的键,否则不知道它们是否存在。



 类似资料:
  • 问题内容: 我们有下面的查询。使用LEFT OUTER联接需要9秒钟才能执行。将LEFT OUTER更改为LEFT INNER可以将执行时间减少到2秒,并且返回 相同 数量的行。由于正在处理dbo.Accepts表中相同数量的行,而不论联接类型如何,为什么外层要花3倍的时间? 问题答案: 返回相同行数的事实是事后事实,查询优化器无法预先知道Accepts中的每一行在Marker中都有匹配的行,可以

  • 我有一张小桌子(2k)的记录和一张大桌子(5 mil)的记录。我需要从小表中获取所有数据,只从大表中获取匹配数据,因此我在下面执行了查询

  • 问题内容: 在使用jQuery学习Ajax请求的过程中,我尝试通过单击链接来加载google主页。所以我写了类似的东西: 在身体某处: 哪个没有用,最初我以为是语法错误或某些错误。但是后来,当我在服务器上用静态html文件替换google url时,它可以正常工作。 它是设计成这样工作的(如果是,为什么?),或者我做错了什么? 编辑:请问有人可以解释(或引用)跨域ajax调用引入的安全性问题吗?换

  • 问题内容: 我有一条来自Oracle + SAS环境的巨大SQL语句。我得到了大部分,但最让我困惑的是WHERE子句中的Left Outer Joins /加号。我需要将其转换为Postgres。我可以处理代码的第一部分,这是使我感到困惑的联接。 我知道从Oracle转换时如何进行简单的联接,但是,该联接中有多个相同表的实例正在进行联接比较,并且混合了许多不需要联接的条件。那么如何进行联接呢?语句

  • 问题内容: 我正在阅读Python入门教科书,发现以下内容: 同一行上的运算符具有相同的优先级,并且从左到右应用,除了幂运算从右到左应用。 我了解大多数情况,但我不明白为什么他们说从右到左应用了幂运算。他们也没有提供任何示例。另外,我可以问这样的一般性问题吗,还是只喜欢解决问题的问题? 问题答案: 该运营商遵循正常的数学约定; 它是右关联的: 在通常的计算机科学术语中,数学上的幂是右联想的,这意味

  • 使用lombok@Data时(添加了EqualsAndHashCode) 它添加了方法 它只被称为一次: 我搜索并找到了关于访问级别的讨论 如果您在非最终类中实现equals和hashCode,我们能做的最安全的事情就是像我们这样添加can等于。因为我们不添加任何字段,所以成本很低,尤其是如果方法受到保护的话。 但是为什么我们需要这个生成的方法呢?它不能是内联的吗?