Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.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
Asp.net 如何防止Orchard投影引发数百个查询_Asp.net_Asp.net Mvc_Orchardcms_Orchardcms 1.6 - Fatal编程技术网

Asp.net 如何防止Orchard投影引发数百个查询

Asp.net 如何防止Orchard投影引发数百个查询,asp.net,asp.net-mvc,orchardcms,orchardcms-1.6,Asp.net,Asp.net Mvc,Orchardcms,Orchardcms 1.6,我对Orchard中的投影模块有以下问题: 我有一些带有主要类别的页面,当打开这些页面时,它们会查询数据库(不是来自单独应用程序的Orchard数据库)中的子类别和这些子类别中的项目 我有一个投影,显示了一个小部件中的主要类别标题,以便于导航。然而,页面加载时间猛增,因为即使在投影中,它也试图将每个主要类别作为一个整体加载,从而导致针对第二个数据库的查询量呈指数级增长,加载时间超过30秒 Projections模块是否可以只查询标题部分(可能还有任何自定义绑定),而忽略执行这些查询的部分 提前谢

我对Orchard中的投影模块有以下问题:
我有一些带有主要类别的页面,当打开这些页面时,它们会查询数据库(不是来自单独应用程序的Orchard数据库)中的子类别和这些子类别中的项目

我有一个投影,显示了一个小部件中的主要类别标题,以便于导航。然而,页面加载时间猛增,因为即使在投影中,它也试图将每个主要类别作为一个整体加载,从而导致针对第二个数据库的查询量呈指数级增长,加载时间超过30秒

Projections模块是否可以只查询标题部分(可能还有任何自定义绑定),而忽略执行这些查询的部分

提前谢谢

编辑

我们使用了Mini Profiler,结果如下:

问题似乎出在第111行的Orchard.Projections.Drivers.ProjectionPartDriver的显示方法中:

var contentItems = _projectionManager.GetContentItems(query.Id, pager.GetStartIndex() +     part.Record.Skip, pager.PageSize).ToList();

对此我能做些什么?

我认为这个N+1查询问题是由以下事实造成的:一些部件的记录是延迟加载的,因此,对于每个访问的部件,每个获取的项目都有一个后续查询

使用ContentQuery,可以通过IHqlQuery(投影仪过滤器中使用的查询)急切地加载零件记录,您可以使用其Join()方法加入(=急切地加载)表。不过,这需要您编写代码:创建一个仅在表中联接的投影仪过滤器提供程序,然后将此过滤器用于相应的查询


我不知道有哪种更简单的方法可以让投影仪快速加载,但这是值得探索的。为什么不就此提出一个问题?

问题是,第二个数据库的代码不像Orchard本身使用的NHibernate,而是使用实体框架。加载的部分(通过管理器)在实体框架中执行大量查询。我现在正试图在其中构建缓存。是否可以使用过滤器防止加载标题部分以外的内容?顺便说一句,您希望我在问题中报告什么?仅加载其属性被访问的部件。大多数情况下,这意味着只加载显示某些内容的零件:使用Placement.info隐藏除零件标题以外的所有内容应该可以解决问题。我考虑过创建一个关于为投影仪查询而急切加载零件记录的问题。是否应该使用placement.info隐藏它们,即使它们不在那里?是的。如果驱动程序编码正确,那么如果Placement.info中隐藏了某些内容,则大多数处理将不会进行。