我运行的Orchard CMS与用户同步相关联。此同步会在一夜之间更新每个用户,代码以
开头... = mContentManager.Get<Orchard.Users.Models.UserPart>(lOrchardUser.ContentItem.Id,
Orchard.ContentManagement.VersionOptions.DraftRequired);
正如您所看到的,VersionOptions.DraftRequired
传递给Get()
方法,并在每次用户同步时创建新草稿。它并不打算在这里创建新草稿,因此我将其更改为VersionOptions.Published
,这样可以避免在每次调用时创建新的版本记录。
但问题是,过去传递VersionOptions.DraftRequired
已为每个用户创建了大约120个版本记录,而数据库中大约有1000个用户。
当我现在使用IContentManager.Query()
时,由于版本量很大,所需时间会相当长。
我的想法是删除除已发布版本之外的所有版本,因为我不需要它们,但IContentManager
没有提供任何版本删除选项并使用IRepository<>
删除记录导致NHibernate异常。
所以我最后的办法是使用LINQ查询来删除版本,这确实有效,但我被告知不建议在Orchard中使用LINQ。
我想知道是否有人对大量版本记录有任何问题,因为系统运行的时间越长,累积的数据越多,系统越来越慢。
所以,我的问题是
答案 0 :(得分:1)
由于似乎没有Orchard的方法,我删除了具有以下LINQ 2 SQL代码的版本:
public System.Web.Mvc.ActionResult RemoveVersions()
{
// select user ids, an alternate way is to retrieve user IDs via content manager but this takes a veeeeery long time due
// to the need of querying all versions
//
// var lOrchardUserIDs = mContentManager
// .Query<Orchard.Users.Models.UserPart, Orchard.Users.Models.UserPartRecord>(Orchard.ContentManagement.VersionOptions.AllVersions)
// .List()
// .Select(u => u.Id)
// .ToList()
var lOrchardUserIDs = mUserRepository.Fetch(u => true).Select(u => u.Id).ToList();
foreach (var lOrchardUserID in lOrchardUserIDs)
{
var lContentItemVersionRecords =
(from r in DataContext.ContentItemVersionRecords where r.ContentItemRecord_id == lOrchardUserID select r).ToList();
if (lContentItemVersionRecords.Count > 1)
{
foreach (var lContentItemVersionRecord in lContentItemVersionRecords)
{
if (lContentItemVersionRecord.Number == 1)
{
if (lContentItemVersionRecords[lContentItemVersionRecords.Count - 1].Published)
{
lContentItemVersionRecord.Latest = true;
lContentItemVersionRecord.Published = true;
}
}
else
DataContext.ContentItemVersionRecords.DeleteOnSubmit(lContentItemVersionRecord);
}
}
}
DataContext.SubmitChanges();
return Content("Done");
}