Я постараюсь быть максимально конкретным. Итак, мы используем 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, поэтому, если вам нужны какие-либо дополнительные данные, пожалуйста, дайте мне знать.
Вы говорите о втором методе, GetReleaseNoteItemsByReleaseNoteParent? – Anthony
@ Энтони: Да, я говорю о втором методе. – Phani
Я никогда не думал о том, чтобы список был медленным. Большое спасибо, теперь это намного быстрее, чем за секунду. Спасибо! – Anthony