为什么EntityFramework从Lambda表达式创建不必要的SQL查询

时间:2019-06-04 15:57:05

标签: sql asp.net entity-framework entity-framework-core

我有2个实体模型(“人”和“组”),并且2个模型结合在一个属性上。 linq中的sql为这些模型创建了左联接,但它也为Group创建了另一个查询。

public class Person
{
    public int Id;
    public string Name;
    public int GroupId;
    public Group Group;
    ...
}

public class Group
{
    public int Id;
    public string Name;
    ...
}

在Person模型的配置中

builder.HasOne(x => x.Group).WithMany().HasForeignKey(x => x.GroupId)

Lambda表达式

return context.Include(x => x.Group)
.Select(x => new InternalPerson
{ Id = x.Id, Name = x.Name, Group = x.Group.Name})
.ToListAsync();

当我尝试上面的表达式时,它创建了这个sql

SELECT [e].[Id], [e].[Name], [e].[Group], [e.Group].[Id], [e.Group].[Name]
FROM [Person] AS [e]
LEFT JOIN [Group] AS [e.Group] ON [e].[Group] = [e.Group].[Id]

然后它还根据上述结果为每个人创建了此sql。

SELECT [e.Group].[Id], [e.Group].[Name]
FROM [Group] AS [e.Group]

第一个查询已检索到所有必要的数据。我不知道为什么会为每个人创建额外的查询。

即使我尝试不使用“包含”,生成的SQL脚本也是相同的。

当我尝试不使用此属性时,请选择

Group = x.Group.Name

然后它没有创建额外的查询。在这种情况下,我不知道“包含”有什么意义。

0 个答案:

没有答案