2016-02-03 2 views
1

Я постараюсь быть максимально конкретным. Итак, мы используем Sitefinity 8.1.5800, у меня есть несколько модулей динамического контента с именем ReleaseNotes и ReleaseNoteItems. ReleaseNotes имеет несколько полей, но не ссылается на ReleaseNoteItems.Sitefinity: оптимизация запросов динамического содержимого с заданными значениями полей

Примечания к выпуску Элементы имеют поля и соответствующее поле данных для ReleaseNotes.

Таким образом, я могу запросить все ReleaseNoteItems как динамический контент довольно быстро, чем через секунду.

Затем я использую эти объекты, предоставленные sitefinity, и сопоставляю их с объектом C#, поэтому могу использовать сильный тип. Этот процесс сопоставления занимает почти минуту и ​​использует более 600 запросов только для 322 элементов (N + 1).

Вкратце: Мне нужно получить все объекты 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

@ Энтони: Да, я говорю о втором методе. – Phani

+0

Я никогда не думал о том, чтобы список был медленным. Большое спасибо, теперь это намного быстрее, чем за секунду. Спасибо! – Anthony

0

Я бы предположил, что каждый элемент примечания к выпуску под одной заметкой о выпуске будет связан с одним и тем же продуктом, не так ли?

Если да, то вам нужно использовать метод GetMcProductId для каждого элемента?

+0

Я действительно могу полностью удалить GetMcProductId, и это все еще занимает много времени. – Anthony

0

Look Arno здесь: 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

Смежные вопросы