這個問題是在處理層級查詢上出現的,按照以前的經驗當查詢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 { get; set; }
[ForeignKey( " Owner ")]
public Guid UserId { get; set; }
public MyUser Owner { get; set; }
}
[Table( " WorkExperience ", Schema = " Resume ")]
public class MyWorkExper
{
[Key]
public int WorkId { get; set; }
[ForeignKey( " Owner ")]
public Guid UserId { get; set; }
public MyUser Owner { get; set; }
}
[Table( " project ",Schema = " Resume ")]
public class MyProject
{
[Key]
public int ProjectId { get; set; }
[ForeignKey( " Owner ")]
public Guid UserId { get; set; }
public MyUser Owner { get; set; }
}
[Table( " EnterpriseUser ", Schema = " Offer ")]
public class MyUser
{
[Key]
[Column( " UserGuid ")]
public Guid UserId { get; set; }
public virtual ICollection<MyResume> Resumes { get; set; }
public virtual ICollection<MyProject> Projects { get; set; }
public virtual ICollection<MyWorkExper> Works { get; set; }
public virtual ICollection<MyJob> Jobs { get; set; }
}
[Table( " Offer ", Schema = " Offer ")]
public class MyJob
{
[Key]
public long Key
{
get;
set;
}
[ForeignKey( " Owner ")]
[Required]
public Guid UserID { get; set; }
public virtual MyUser Owner { get; set; }
}
{
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 { get; set; }
[ForeignKey( " Owner ")]
public Guid UserId { get; set; }
public MyUser Owner { get; set; }
}
[Table( " WorkExperience ", Schema = " Resume ")]
public class MyWorkExper
{
[Key]
public int WorkId { get; set; }
[ForeignKey( " Owner ")]
public Guid UserId { get; set; }
public MyUser Owner { get; set; }
}
[Table( " project ",Schema = " Resume ")]
public class MyProject
{
[Key]
public int ProjectId { get; set; }
[ForeignKey( " Owner ")]
public Guid UserId { get; set; }
public MyUser Owner { get; set; }
}
[Table( " EnterpriseUser ", Schema = " Offer ")]
public class MyUser
{
[Key]
[Column( " UserGuid ")]
public Guid UserId { get; set; }
public virtual ICollection<MyResume> Resumes { get; set; }
public virtual ICollection<MyProject> Projects { get; set; }
public virtual ICollection<MyWorkExper> Works { get; set; }
public virtual ICollection<MyJob> Jobs { get; set; }
}
[Table( " Offer ", Schema = " Offer ")]
public class MyJob
{
[Key]
public long Key
{
get;
set;
}
[ForeignKey( " Owner ")]
[Required]
public Guid UserID { get; set; }
public virtual MyUser Owner { get; set; }
}