相关实体加载性能!!! [英] Related entities loading performance!!!

查看:54
本文介绍了相关实体加载性能!!!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Hi gents。

想象一下,我有班级ContinuumEvent。

Imagine i have class ContinuumEvent.

它有2个相关的收藏品

  [DataMember]

  public IList< PersistedBehavior>行为{得到;私人集; }

 [DataMember]
 public IList<PersistedBehavior> Behaviors { get; private set; }

[DataMember]

  public IList< PersistedMetadata>元数据{get;组; }

[DataMember]
 public IList<PersistedMetadata> Metadata { get; set; }

 

这是我创建上下文的代码:

Here is my code for context creation:

var builder = new ContextBuilder< ContinuumContext>();

            builder.Entity< ContinuumEvent>()HasKey(E => e.ProviderName)。.HasKey(E => e.EventId);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; builder.Entity< PersistedMetadata>()HasKey(B => b.Id);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; builder.Entity< PersistedMetadata>()。Property(b => b.Id).IsIdentity();

          &NBSP;&NBSP; builder.Entity< PersistedBehavior>()HasKey(B => b.Id);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; builder.Entity< PersistedBehavior>()属性(B => b.Id)。.IsIdentity();

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP; builder.RegisterSet< PersistedMetadata>(" Metadata");

            builder.Entity< ContinuumEvent>()的关系< PersistedBehavior>(EV => ev.Behaviors);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP; builder.Entity< ContinuumEvent>()的关系< PersistedMetadata>(EV => ev.Metadata);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP; var context = builder.Create(new SqlConnection(connectionString));



           &NBSP; context.ContextOptions.LazyLoadingEnabled = true;

           返回上下文;

var builder = new ContextBuilder<ContinuumContext>();
            builder.Entity<ContinuumEvent>().HasKey(e => e.ProviderName).HasKey(e => e.EventId);
            builder.Entity<PersistedMetadata>().HasKey(b => b.Id);
            builder.Entity<PersistedMetadata>().Property(b => b.Id).IsIdentity();
            builder.Entity<PersistedBehavior>().HasKey(b => b.Id);
            builder.Entity<PersistedBehavior>().Property(b => b.Id).IsIdentity();
            builder.RegisterSet<PersistedMetadata>("Metadata");
            builder.Entity<ContinuumEvent>().Relationship<PersistedBehavior>(ev => ev.Behaviors);
            builder.Entity<ContinuumEvent>().Relationship<PersistedMetadata>(ev => ev.Metadata);
            var context = builder.Create(new SqlConnection(connectionString));

            context.ContextOptions.LazyLoadingEnabled = true;
            return context;

 

所以我从db检索~1500个事件,每个事件有2个行为和2个元数据。

So i retrieve ~ 1500 events from db and each event has 2 behaviors and 2 metadata.

var result = _getEventsByOriginQuery(context,origin,endDate);
$
foreach(结果中的var ev)

{

&NBSP;&NBSP;&NBSP;&NBSP; context.LoadProperty(ev," Behaviors");

     context.LoadProperty(ev,"Metadata");

     events.Add(ev);

}

var result = _getEventsByOriginQuery(context, origin, endDate);
foreach (var ev in result)
{
     context.LoadProperty(ev, "Behaviors");
     context.LoadProperty(ev, "Metadata");
     events.Add(ev);
}

第一行执行需要30毫秒。

The first line execution takes 30 msec.

属性加载需要<强> 9.5秒。

任何建议为什么会有巨大的性能损失????

Any suggestions why there is huge performance penalty????

谢谢

推荐答案

您好Kirill,

Hi Kirill,

每次LoadProperty调用都会导致执行单独的数据库查询。如果您始终知道您将需要相关的收集数据,则应使用"渴望"。加载而不是延迟加载。使用EF执行此操作的方法是在指定查询时使用Include方法
。类似于:

Each LoadProperty call is resulting in a separate database query being executed. If you always know that you will need the related collection data, you should use "eager" loading instead of lazy loading. The way to do this with EF is to use the Include method when you specify your query. Something like:

var q = from e in context.Events.Include("Behaviors").Include("Metadata") select e;

执行此操作将允许EF在单个查询中加载所有数据。

Doing this will allow EF to load all of the data in a single query.

希望这有帮助。

Andrew。


这篇关于相关实体加载性能!!!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆