我将尝试尽可能具体。因此,我们使用的是Sitefinity 8.1.5800,我有几个名为ReleaseNotes和ReleaseNoteItems的动态内容模块。 ReleaseNotes有一些字段,但没有对ReleaseNoteItems的引用。

发行说明项目具有与发行说明相关的字段和相关数据字段。

因此,我可以在不到一秒钟的时间内快速查询所有ReleaseNoteItems作为动态内容。

然后,我使用sitefinity提供的这些对象并将它们映射到C#对象,以便可以使用强类型。此映射过程耗时近一分钟,仅对322个项目(N + 1)使用了600多个查询。

简而言之:我需要获取所有sitefinity对象,并将它们映射到可用的c#对象的速度比现在快。

提取动态内容项的方法(以毫秒为单位):



private IList<DynamicContent> GetAllLiveReleaseNoteItemsByReleaseNoteParentId(Guid releaseNoteParentId)
       {
           DynamicModuleManager dynamicModuleManager = DynamicModuleManager.GetManager(String.Empty);
           Type releasenoteitemType = TypeResolutionService.ResolveType("Telerik.Sitefinity.DynamicTypes.Model.ReleaseNoteItems.Releasenoteitem");
           string releaseNoteParentTypeString = "Telerik.Sitefinity.DynamicTypes.Model.ReleaseNotes.Releasenote";
           var provider = dynamicModuleManager.Provider as OpenAccessDynamicModuleProvider;
           int? totalCount = 0;

           var cultureName = "en";
           Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName);


           Type releasenoteType = TypeResolutionService.ResolveType("Telerik.Sitefinity.DynamicTypes.Model.ReleaseNotes.Releasenote");

           // This is how we get the releasenote items through filtering

           DynamicContent myCurrentItem = dynamicModuleManager.GetDataItem(releasenoteType, releaseNoteParentId);

           var myMasterParent =
               dynamicModuleManager.Lifecycle.GetMaster(myCurrentItem) as DynamicContent;

           var relatingItems = provider.GetRelatedItems(
                releaseNoteParentTypeString,
                "OpenAccessProvider",
                myMasterParent.Id,
                string.Empty,
                releasenoteitemType,
                ContentLifecycleStatus.Live,
                string.Empty,
                string.Empty,
                null,
                null,
                ref totalCount,
                RelationDirection.Parent).OfType<DynamicContent>();
           IList<DynamicContent> allReleaseNoteItems = relatingItems.ToList();

           return allReleaseNoteItems;
       }




这是将站点范围对象映射到C#对象大约需要一分钟的方法:

public IList<ReleaseNoteItemModel> GetReleaseNoteItemsByReleaseNoteParent(ReleaseNoteModel releaseNoteItemParent)
       {

          return  GetAllLiveReleaseNoteItemsByReleaseNoteParentId(releaseNoteItemParent.Id).Select(rn => new ReleaseNoteItemModel
           {

               Id = rn.Id,
               Added = rn.GetValue("Added") is bool ? (bool)rn.GetValue("Added") : false,
               BugId = rn.GetValue<string>("bug_id"),
               BugStatus = rn.GetValue<Lstring>("bugStatus"),
               Category = rn.GetValue<Lstring>("category"),
               Component = rn.GetValue<Lstring>("component"),
               @Content = rn.GetValue<Lstring>("content"),
               Criticality = rn.GetValue<Lstring>("criticality"),
               Customer = rn.GetValue<string>("customer"),
               Date = rn.GetValue<DateTime?>("date"),
               Grouped = rn.GetValue<string>("grouped"),
               Override = rn.GetValue<string>("override"),
               Patch_Num = rn.GetValue<string>("patch_num"),
               PublishedDate = rn.PublicationDate,
               Risk = rn.GetValue<Lstring>("risk"),
               Title = rn.GetValue<string>("Title"),
               Summary = rn.GetValue<Lstring>("summary"),
               Prod_Name = rn.GetValue<Lstring>("prod_name"),
               ReleaseNoteParent = releaseNoteItemParent,
               McProductId = GetMcProductId(rn.GetRelatedItems("McProducts").Cast<DynamicContent>()),

           }).ToList();

       }




有什么方法可以将所有这些优化到一个查询中,还是有更好的方法呢?花费几乎一分钟的时间来映射此对象对于我们需要对其进行处理的时间太长。

如果没有办法,我们将不得不缓存项目或进行SQL查询。如果不需要,我宁愿不执行缓存或SQL查询。

预先感谢您能提供的所有帮助,我是刚开始在stackoverflow上发布问题的人,因此,如果您需要任何其他数据,请告诉我。

最佳答案

为什么要对这些项目执行.ToList()?您有可能避免这种情况吗?我认为,大部分时间(1分钟以内)都用于将您的所有商品转换为列表。从Sitefinity对象到C#对象的转换不是这里的罪魁祸首。

关于c# - Sitefinity:具有字段值的动态内容查询优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35181125/

10-13 06:23