2016-02-03 40 views
1

我会尝试尽可能具体。所以我们使用Sitefinity 8.1.5800,我有一对名为ReleaseNotes和ReleaseNoteItems的动态内容模块。 ReleaseNotes有一些字段,但没有引用ReleaseNoteItems。Sitefinity:使用字段值进行动态内容查询优化

版本说明项目包含字段和与ReleaseNotes相关的数据字段。

因此,我可以查询所有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; 
     } 

这是需要几乎一分钟的是映射sitefinity目的是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,所以如果你需要任何额外的数据,请让我知道。

回答

2

是否有一个原因,你为什么要为.ToList()项目?是否有可能避免这种情况。在我看来,大部分时间(1分钟)都会将所有项目转换为列表。从Sitefinity对象到C#对象的转换不是这里的罪魁祸首。

+0

你说的是第二种方法,GetReleaseNoteItemsByReleaseNoteParent? – Anthony

+0

@Anthony:是的,我正在谈论第二种方法。 – Phani

+0

我从来没有想过这个放荡的人。非常感谢,现在比不上一秒钟快得多。谢谢! – Anthony

0

我会想象在单个版本注释下的每个版本注释项目都与相同的产品有关吗?

如果是这样,您是否需要为每个项目执行GetMcProductId方法?

+0

我实际上可以完全删除GetMcProductId,它仍然需要很长时间。 – Anthony

0

看阿诺的答案在这里:https://plus.google.com/u/0/112295105425490148444/posts/QrsVtxj1sCB?cfem=1

您可以使用“内容链接管理器”来查询动态模块的关系(包括由家长-ParentItemId-或孩子-ChildItemId-)要快得多:

var providerName = String.Empty; 
var parentTitle = "Parent"; 
var relatedTitle = "RelatedItem3"; 

DynamicModuleManager dynamicModuleManager = DynamicModuleManager.GetManager(providerName); 
Type parentType = TypeResolutionService.ResolveType("Telerik.Sitefinity.DynamicTypes.Model.ParentModules.ParentModule"); 
Type relatedType = TypeResolutionService.ResolveType("Telerik.Sitefinity.DynamicTypes.Model.RelatedModules.RelatedModule"); 

ContentLinksManager contentLinksManager = ContentLinksManager.GetManager(); 

// get the live version of all parent items 
var parentItems = dynamicModuleManager.GetDataItems(parentType).Where(i => i.GetValue<string>("Title").Contains(parentTitle) && i.Status == ContentLifecycleStatus.Live && i.Visible); 

// get the ids of the related items. 
// We use the OriginalContentId property since we work with the live vesrions of the dynamic modules 
var parentItemIds = parentItems.Select(i => i.OriginalContentId).ToList(); 

// get the live versions of all the schedules items 
var relatedItems = dynamicModuleManager.GetDataItems(relatedType).Where(i => i.Status == ContentLifecycleStatus.Live && i.Visible && i.GetValue<string>("Title").Contains(relatedTitle)); 

// get the content links 
var contentLinks = contentLinksManager.GetContentLinks().Where(cl => cl.ParentItemType == parentType.FullName && cl.ComponentPropertyName == "RelatedField" && parentItemIds.Contains(cl.ParentItemId) && cl.AvailableForLive); 

// get the IDs of the desired parent items 
var filteredParentItemIds = contentLinks.Join<ContentLink, DynamicContent, Guid, Guid>(relatedItems, (cl) => cl.ChildItemId, (i) => i.OriginalContentId, (cl, i) => cl.ParentItemId).Distinct(); 

// get the desired parent items by the filtered IDs 
var filteredParentItems = parentItems.Where(i => filteredParentItemIds.Contains(i.OriginalContentId)).ToList(); 
+0

大家一直说这是相关数据,我一定会错过一些东西。第一种方法GetAllLiveReleaseNoteItemsByReleaseNoteParentId不到一秒钟。而第二种方法,GetReleaseNoteItemsByReleaseNoteParent即使在删除相关数据(McProductId完全)后仍然需要大约40秒。相关数据一旦删除,哪里是? – Anthony