Sql server 如何改进此实体框架查询

Sql server 如何改进此实体框架查询,sql-server,linq,linq-to-sql,entity-framework-core,Sql Server,Linq,Linq To Sql,Entity Framework Core,我拥有以下实体: 申请人:人 电话号码 电话类型 申请人来源于个人。申请人有许多电话号码s(最多三个)。每个电话号码只有1个电话类型 public class Applicant : Person { public virtual ICollection<PhoneNumber> PhoneNumbers { get; set; } } public class PhoneNumber { public

我拥有以下实体:

  • 申请人:人
  • 电话号码
  • 电话类型
申请人来源于
个人
申请人
有许多
电话号码
s(最多三个)。每个
电话号码
只有1个
电话类型

public class Applicant : Person
{    
    public virtual ICollection<PhoneNumber> PhoneNumbers { get; set; }
}

public class PhoneNumber 
{                        
    public int PersonId { get; set; }

    [Required]
    [MaxLength(17)]
    public string Number { get; set; }    

    public int PhoneTypeId { get; set; }            

    public virtual PhoneType PhoneType { get; set; }

}

public class PhoneType 
{     
    [Required]
    [MaxLength(24)]
    public string Name { get; set; }

    public virtual ICollection<PhoneNumber> PhoneNumbers { get; set; }
}

提前感谢您可能提供的任何帮助

EF Core支持通过组合Include()和thenclude()加载多个级别,更多信息

要将电话与电话类型一起加载,您的查询应该如下所示(为了清晰起见,我删除了其余的关系):


EF Core支持通过将Include()与thenclude()组合加载多个级别,更多信息

要将电话与电话类型一起加载,您的查询应该如下所示(为了清晰起见,我删除了其余的关系):


谢谢你,电子蝙蝠。我会试试的。再次谢谢你。我不仅使它工作了,而且在此过程中学会了一种新技术。@Andy,很高兴能提供帮助,改进应用程序的下一步是使用异步方法,如FirstOrDefautlAsync();)是的,我知道。当我写BusinessLogicLayer和RepositoryLayer的时候我很懒。你欺骗了我。整个存储库层和业务逻辑层现在都是同步的。我会试试的。再次谢谢你。我不仅使它工作了,而且在此过程中学会了一种新技术。@Andy,很高兴能提供帮助,改进应用程序的下一步是使用异步方法,如FirstOrDefautlAsync();)是的,我知道。当我写BusinessLogicLayer和RepositoryLayer的时候我很懒。你欺骗了我。整个存储库层和业务逻辑层现在都是同步的。
/*------------------------------------------*/
/* Obtain the Applicant                     */
/*------------------------------------------*/
IQueryable<Applicant> applicantQuery = 
      DbContext.Applicants.Where(a => a.CreatedBy == userId)
               .Include(applicant => applicant.Address)
               .Include(applicant => applicant.Address.StateProvince)
               .Include(applicant => applicant.PhoneNumbers)                                                
               .Include(applicant => applicant.HomeChurch)
               .Include(applicant => applicant.HomeChurch.Address)
               .Include(applicant => applicant.HomeChurch.Address.StateProvince)
               .Include(applicant => applicant.TripApplication);

Applicant applicant = applicantQuery.FirstOrDefault<Applicant>();

if (applicant != null && applicant.PhoneNumbers != null)
{
    IQueryable<PhoneType> phoneTypeQuery = DbContext.Set<PhoneType>();
    List<PhoneType> phoneTypes = phoneTypeQuery.ToList<PhoneType>();

    foreach (PhoneNumber ph in applicant.PhoneNumbers)
    {
        ph.PhoneType = (phoneTypes.Where(pt => pt.Id == ph.PhoneTypeId)).First();
    }
}
var applicant = DbContext.Applicants.Where(a => a.CreatedBy == userId)
        .Include(applicant => applicant.PhoneNumbers)                                                
        .ThenInclude(phone => phone.PhoneType)
        .FirstOrDefault();