我目前正在尝试通过以下方式获取一位家长的所有关系项:
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
最佳答案
我建议获取父节点或 Id - 然后使用
ApplicationContext.Services.RelationService.GetById(parent.Id)因为它的数据库查询较少。
关于c# - Umbraco RelationService.GetByParentId(memberId) 慢。每个项目触发两个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31282575/