Entity framework 在内存中保存实体框架对象图的最佳方法是什么?
我有一个长时间运行的过程,它集成了一组传入实体,以确定传入实体是否与持久存储中的实体不同 当我第一次写这篇文章时,我从数据库中检索了与我要比较的实体相匹配的每个实体,我还有一些include要拉入我也需要比较的引用实体。这非常慢,因为每次比较都涉及数据库查询,然后是实体框架“修复” 我现在使用一个查询,在我开始这个过程之前,把我进行比较所需要的所有实体都拉进来。这让我可以在前面加快速度,这样我就可以大大加快我的进程。但是,初始查询仍然至少需要一两分钟才能执行Entity framework 在内存中保存实体框架对象图的最佳方法是什么?,entity-framework,Entity Framework,我有一个长时间运行的过程,它集成了一组传入实体,以确定传入实体是否与持久存储中的实体不同 当我第一次写这篇文章时,我从数据库中检索了与我要比较的实体相匹配的每个实体,我还有一些include要拉入我也需要比较的引用实体。这非常慢,因为每次比较都涉及数据库查询,然后是实体框架“修复” 我现在使用一个查询,在我开始这个过程之前,把我进行比较所需要的所有实体都拉进来。这让我可以在前面加快速度,这样我就可以大大加快我的进程。但是,初始查询仍然至少需要一两分钟才能执行 Dictionary<long
Dictionary<long, SomeEntity> someEntities = new SomeEntitiesInclude().ApplyTo(context.SomeEntities)
.Where(se => se.SomeRelatedEntity.ID == relatedEntityID)
.Where(se => se.SCDCurrent == true)
.OrderBy<SomeEntity, long>(se => se.SomeRelatedEntity.ID)
.ToDictionary<SomeEntity, long>(se => se.SomeRelatedEntity.ID);
Dictionary someEntities=new someEntities Include().ApplyTo(context.someEntities)
.Where(se=>se.SomeRelatedEntity.ID==relatedEntityID)
.Where(se=>se.SCDCurrent==true)
.OrderBy(se=>se.SomeRelatedEntity.ID)
.ToDictionary(se=>se.SomeRelatedEntity.ID);
由此产生的实际sql查询执行起来只需要几秒钟,因此我认为大部分时间都花在了“修复”上,以便上下文可以跟踪更改
SomeEntitiesInclude对象允许我使用强类型的include语句,它是Alex James开发的IncludeStratery类的一个子类:
有没有人有加快执行的技巧
为这个冗长的问题道歉
詹姆斯有多种因素可能会减缓这一进程。把这个修好。通过投影到非实体类型,很容易测试修复是否是问题。这就完全消除了方程中的修正。如果这解决了问题,那么很可能是解决了问题,使事情变慢了,我们可以从那里着手解决问题 另一方面,它可能无法解决问题,因为还有其他事情可能会减慢查询的执行。我要看的第一件事是将查询从LINQ表达式编译成SQL。可以使用CompiledQuery类型隔离此步骤。如果生成CompiledQuery需要很长时间,但执行生成的方法只需要很少的时间,那么您已经找到了性能问题的根源
但是,在执行任何操作之前,我可能会确保您的查询不会过于复杂。在不知道你在做什么的情况下,确切地说,我不能说你是否真的需要返回的所有字段。但是,如果您只需要几个类型中的几个字段,那么最好投影到非实体类型,而不是返回完全物化的实体。感谢Craig,这是一个非常有用的回答,它至少为我提供了一个调查的起点。