当我调查Include
和Join
之间的区别时,我发现:
如果数据库没有包含外键 - 它没有导航道具,所以最好使用Join
如果 有导航道具 - 那么请使用Include
。 (它还可以节省数据库命中率。)
但有一个answer here引起了我的注意:
Include实现为连接。 取决于可空性 包含链接,它是内部或左加入。
问题:
无效如何影响左/内连接?
在Sql server中,我可以有一个Cities
表和Persons
表,一个人可以拥有NULL
CityID
。
为什么实体框架会为我决定它是什么类型的联接?
现在让我们将CityId更改为非null:
这是改变:
答案 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 。