【发布时间】:2015-07-08 02:34:58
【问题描述】:
我目前正在尝试通过调用来获取一位父母的所有关系项目:
var items = ApplicationContext.Current.Services.RelationService.GetByParentId(members.GetCurrentMemberId()).ToArray();
一切正常。除了当我查看 MiniProfiler 时,我可以看到它会触发每个项目的两个查询,这会导致大量项目出现一些主要的性能问题。
我查看了 UmbracoCMS 代码,发现了这段代码:
protected override IEnumerable<IRelation> PerformGetByQuery(IQuery<IRelation> query)
{
var sqlClause = GetBaseQuery(false);
var translator = new SqlTranslator<IRelation>(sqlClause, query);
var sql = translator.Translate();
var dtos = Database.Fetch<RelationDto>(sql);
foreach (var dto in dtos)
{
yield return Get(dto.Id);
}
}
dtos 上的 foreach 正在将每个 MoveNext() 的查询发送到 umbracoRelationType 表。 Get() 方法实际上是从umbracoRelation 表中查询单个项目。
我认为它应该利用那里的缓存,但显然不是。
无论如何。如何在这里提高性能?我是否可以在不完全绕过 Umbraco 的情况下以某种方式仅通过一次查询获得内容?
我正在使用 Umbraco 7.2.6
【问题讨论】:
-
也许在our.umbraco.org 上问同样的问题 - 或者最终在issues.umbraco.org 上创建一个问题?我知道这不会自动解决您的问题,但也许更多地关注它可以让您更接近:-)
-
谢谢。我在这里提交了问题:issues.umbraco.org/issue/U4-6801
-
您的 MiniProfiler 配置文件屏幕截图从 40 秒开始!我更感兴趣的是那段时间发生的事情,而不是你发布的 sn-p 期间发生的事情。