EntityFramework中使用Include可能帶來的問題


這個問題是在處理層級查詢上出現的,按照以前的經驗當查詢A以及A的子集合B[]的時候join一下比分兩次查詢快,但是當子集合比較多等原因的時候時間不是線性增長而是指數,原因應該是重復數據帶來的效率負載增加,比如第一種我的單元測試時間Duration在4-6左右,當增加到3個子集合的時候就在14-22之間了,而Ef中的做法是把每個join結果unicon 起來,看着那么大串的數據不慢才怪,還是乖乖分開了。

 

 時間如圖:

 

測試代碼:

     public  class ModelTesting
    {
         private EFContext _dbContext;
         public ModelTesting()
        {
             string cnn = System.Configuration.ConfigurationManager.ConnectionStrings[ 0].ConnectionString;

            _dbContext =  new EFContext(cnn);
            
        }
        [Fact]
         public  void Test()
        {
             var key =  1000;
             var uid =  new Guid( " 3905858E-A32E-DF11-BA8F-001CF0CD104B ");
             var myResume = _dbContext.Set<MyUser>()
                .Single(u => u.UserId == uid);
            myResume.Works.ToList();
            myResume.Resumes.ToList();
            myResume.Projects.ToList();
            myResume.Jobs.ToList();
            myResume=_dbContext.Set<MyUser>()
                .Include( " Resumes ")
                .Include( " Jobs ")
                .Include( " Projects ")
                .Include( " Works ")
                .Single(u => u.UserId == uid);

        }
    }

     public  class EFContext:DbContext
    {
         public EFContext( string cnn): base(cnn)
        {
             this.Configuration.LazyLoadingEnabled =  true;
        }

         protected  override  void OnModelCreating(DbModelBuilder modelBuilder)
        {
             base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<MyResume>();
            modelBuilder.Entity<MyWorkExper>();
            modelBuilder.Entity<MyProject>();
            modelBuilder.Entity<MyUser>();
        }
    }
    [Table( " Resume ", Schema =  " dbo ")]
     public  class MyResume
    {
        [Key]
         public  int Key {  getset; }
        [ForeignKey( " Owner ")]
         public Guid UserId {  getset; }
         public MyUser Owner {  getset; }
    }

    [Table( " WorkExperience ", Schema =  " Resume ")]
     public  class MyWorkExper
    {
        [Key]
         public  int WorkId {  getset; }
        [ForeignKey( " Owner ")]
         public Guid UserId {  getset; }
         public MyUser Owner {  getset; }
    }
        [Table( " project ",Schema =  " Resume ")]
     public  class MyProject
        {
            [Key]
             public  int ProjectId {  getset; }
            [ForeignKey( " Owner ")]
             public Guid UserId {  getset; }
             public MyUser Owner {  getset; }
        }
    [Table( " EnterpriseUser ", Schema =  " Offer ")]
     public   class MyUser
    {
        [Key]
        [Column( " UserGuid ")]
         public Guid UserId {  getset; }
         public  virtual ICollection<MyResume> Resumes {  getset; }
         public  virtual ICollection<MyProject> Projects {  getset; }
         public  virtual ICollection<MyWorkExper> Works {  getset; }
         public  virtual ICollection<MyJob> Jobs {  getset; }
    }
    [Table( " Offer ", Schema =  " Offer ")]
     public  class MyJob
    {
        [Key]
         public  long Key
        {
             get;
             set;
        }
        [ForeignKey( " Owner ")]
        [Required]
         public Guid UserID {  getset; }

         public  virtual MyUser Owner {  getset; }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM