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