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; }
    }
复制代码

 


本文转自today4king博客园博客,原文链接:http://www.cnblogs.com/jinzhao/archive/2012/03/09/2387871.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值