我会尝试尽可能具体。所以我们使用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,所以如果你需要任何额外的数据,请让我知道。
你说的是第二种方法,GetReleaseNoteItemsByReleaseNoteParent? – Anthony
@Anthony:是的,我正在谈论第二种方法。 – Phani
我从来没有想过这个放荡的人。非常感谢,现在比不上一秒钟快得多。谢谢! – Anthony