C# 为什么实体框架核心生成左连接?

C# 为什么实体框架核心生成左连接?,c#,entity-framework-core,inner-join,C#,Entity Framework Core,Inner Join,我正在尝试使用内部连接生成一对多查询,就像我在SQL中通常使用的那样。我简化了模型和查询,以便更容易地解释问题 我已经将此关系定义为一对多关系,这是一个必需的关系,但即使使用此简单语句,我也无法让它生成内部联接。我不想在这里使用左连接,也不想使用由于某种原因EF添加的ORDER BY子句。有人能帮忙吗 modelBuilder.Entity() .HasKey(x=>x.Id); modelBuilder.Entity() .HasMany(x=>x.Books) .WithOne(x=>x.A

我正在尝试使用
内部连接生成一对多查询,就像我在SQL中通常使用的那样。我简化了模型和查询,以便更容易地解释问题

我已经将此关系定义为一对多关系,这是一个必需的关系,但即使使用此简单语句,我也无法让它生成
内部联接。我不想在这里使用
左连接
,也不想使用由于某种原因EF添加的
ORDER BY
子句。有人能帮忙吗

modelBuilder.Entity()
.HasKey(x=>x.Id);
modelBuilder.Entity()
.HasMany(x=>x.Books)
.WithOne(x=>x.Author)
.HasForeignKey(x=>x.AuthorId)
.IsRequired();
modelBuilder.Entity()
.HasKey(x=>x.Id);
modelBuilder.Entity()
.HasOne(x=>x.Author)
.有许多(x=>x.本书)
.HasForeignKey(x=>x.AuthorId)
.IsRequired();
公共类作者
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表书籍{get;set;}
}
公共课堂用书
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共int AuthorId{get;set;}
公共作者{get;set;}
}
var results=Context.Authors.Include(x=>x.Books.ToList();
这将生成以下SQL:

选择[f].[Id],[f].[Name],[f0].[Id],[f0].[Name]
来自[作者]作为[f]
在[f].[Id]=[f0].[AuthorId]上以[f0]的身份左键加入[Book]
由[f].[Id]、[f0].[Id]订购

为什么实体框架在我没有指定的情况下添加了一个
orderby
子句?当我的关系在fluent API配置中按要求指定时,为什么它会生成一个
左连接?

左连接是正确的,因为您需要一个作者列表。内部连接将隐藏还没有书籍的作者。order by是为了EF能够将行排序为对象,以便它知道id更改时,必须创建新对象,并且不需要再跟踪以前的对象。因为您正在尝试获取所有
作者,然后包括他们的书籍。如果有一个作者没有任何书籍,那么在使用简单的
join
时,它将不会被包括在内,因此
left join
可以确保您获得所有作者,而不必拥有书籍。对于排序,我不是很确定,但我认为这是默认的EF机制,它根据IDsOrderBy对结果进行排序:因为这使对象和包含物化变得更容易——它们都在它们所属的地方(即,一旦作者看完所有的书,你就再也不会回到它).你为什么期望或不期望有什么特别的东西?您的研究表明了什么,包括文档?如果您没有告诉我们您的期望和原因,那么我们无法解决您的误解或您正确理解的内容,您只是要求我们重写文档并给出答案。Left join是正确的,因为您要求的是作者列表。内部连接将隐藏还没有书籍的作者。order by是为了EF能够将行排序为对象,以便它知道id更改时,必须创建新对象,并且不需要再跟踪以前的对象。因为您正在尝试获取所有
作者,然后包括他们的书籍。如果有一个作者没有任何书籍,那么在使用简单的
join
时,它将不会被包括在内,因此
left join
可以确保您获得所有作者,而不必拥有书籍。对于排序,我不是很确定,但我认为这是默认的EF机制,它根据IDsOrderBy对结果进行排序:因为这使对象和包含物化变得更容易——它们都在它们所属的地方(即,一旦作者看完所有的书,你就再也不会回到它).你为什么期望或不期望有什么特别的东西?您的研究表明了什么,包括文档?如果您没有告诉我们您的期望和原因,那么我们就无法解决您的误解或您正确理解的内容&您只是要求我们重写文档&所以请回答。