Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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
C# Umbraco RelationService.GetByParentId(memberId)速度较慢。每个项目激发两个查询_C#_Umbraco_Umbraco7 - Fatal编程技术网

C# Umbraco RelationService.GetByParentId(memberId)速度较慢。每个项目激发两个查询

C# Umbraco RelationService.GetByParentId(memberId)速度较慢。每个项目激发两个查询,c#,umbraco,umbraco7,C#,Umbraco,Umbraco7,我当前正在尝试通过调用以下命令获取一个父项的所有关系项: var items = ApplicationContext.Current.Services.RelationService.GetByParentId(members.GetCurrentMemberId()).ToArray(); 一切都很好。除了查看MiniProfiler外,我可以看到它对每个项都进行了两次查询,这会导致大量项出现一些重大性能问题。 我查看了UmbracoCMS代码,发现了以下代码: protected ov

我当前正在尝试通过调用以下命令获取一个父项的所有关系项:

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);
    }
}
受保护的覆盖IEnumerable PerformGetByQuery(IQuery查询)
{
var sqlClause=GetBaseQuery(false);
var translator=新的SqlTranslator(SQL子句,查询);
var sql=translator.Translate();
var dtos=Database.Fetch(sql);
foreach(dto中的var dto)
{
收益返回Get(dto.Id);
}
}
dto
上的foreach正在向
umbracorrelationtype
表发送每个
MoveNext()
的查询。
Get()
方法实际上是从
umbracorrelation
表中查询单个项。 我认为它应该利用那里的缓存,但显然不是

无论如何。如何在这里提高性能?我是否可以在不完全绕过Umbraco的情况下,以某种方式在一个查询中访问内容


我使用的是Umbraco 7.2.6,我建议先获取父节点或Id,然后使用ApplicationContext.Services.RelationService.GetById(parent.Id),因为它的数据库查询较少。

可能会在上问同样的问题,或者最终在上创建问题?我知道这不会自动解决你的问题,但也许多关注它可以让你更接近:-)谢谢。我在这里提交了这个问题:你的MiniProfiler档案截图从40秒开始!我更感兴趣的是那段时间发生的事情,而不是你发布的片段。 ApplicationContext.Services.RelationService.GetById(parent.Id)