博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EntityFramework中使用Include可能带来的问题
阅读量:5894 次
发布时间:2019-06-19

本文共 2418 字,大约阅读时间需要 8 分钟。

这个问题是在处理层级查询上出现的,按照以前的经验当查询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; }
    }

 

转载地址:http://rwisx.baihongyu.com/

你可能感兴趣的文章
Android开发——09Google I/O之让Android UI性能更高效(1)
查看>>
在 SELECT 查询中使用表表达式
查看>>
(二) php if语句,switch语句,continue语句,return语句,for 、while、do while 循环
查看>>
edx 获取当前request
查看>>
安卓中如何实现滑动导航
查看>>
Java-金额小数转换成中文大写金额
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
squid.3.2故障整理
查看>>
Ansible Tower安装配置全过程(上)
查看>>
地址与引用
查看>>
十大开源ERP点评 献给深水区的中小企业和CIO们
查看>>
【PHP】创蓝253云通信平台国际短信接口调用demo案例
查看>>
Confluence 6 重要缓存和监控
查看>>
Day 30 shell 编程
查看>>
静态路由和默认路由
查看>>
谈一谈Spring-Mybatis在多数据源配置上的坑
查看>>
2.1 shell语句
查看>>
【精益生产】车间现场管理的八大浪费
查看>>
springMVC国际化
查看>>