gpt4 book ai didi

c# - Sitefinity:使用字段值进行动态内容查询优化

转载 作者:太空宇宙 更新时间:2023-11-03 21:14:45 26 4
gpt4 key购买 nike

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

Release Note Items 有字段和 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 上发布问题,所以如果您需要任何其他数据,请告诉我。

最佳答案

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com