Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 在内存中保存实体框架对象图的最佳方法是什么?_Entity Framework - Fatal编程技术网

Entity framework 在内存中保存实体框架对象图的最佳方法是什么?

Entity framework 在内存中保存实体框架对象图的最佳方法是什么?,entity-framework,Entity Framework,我有一个长时间运行的过程,它集成了一组传入实体,以确定传入实体是否与持久存储中的实体不同 当我第一次写这篇文章时,我从数据库中检索了与我要比较的实体相匹配的每个实体,我还有一些include要拉入我也需要比较的引用实体。这非常慢,因为每次比较都涉及数据库查询,然后是实体框架“修复” 我现在使用一个查询,在我开始这个过程之前,把我进行比较所需要的所有实体都拉进来。这让我可以在前面加快速度,这样我就可以大大加快我的进程。但是,初始查询仍然至少需要一两分钟才能执行 Dictionary<long

我有一个长时间运行的过程,它集成了一组传入实体,以确定传入实体是否与持久存储中的实体不同

当我第一次写这篇文章时,我从数据库中检索了与我要比较的实体相匹配的每个实体,我还有一些include要拉入我也需要比较的引用实体。这非常慢,因为每次比较都涉及数据库查询,然后是实体框架“修复”

我现在使用一个查询,在我开始这个过程之前,把我进行比较所需要的所有实体都拉进来。这让我可以在前面加快速度,这样我就可以大大加快我的进程。但是,初始查询仍然至少需要一两分钟才能执行

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,这是一个非常有用的回答,它至少为我提供了一个调查的起点。