Sql 为什么Orchard在执行内容项查询时速度如此缓慢?

Sql 为什么Orchard在执行内容项查询时速度如此缓慢?,sql,performance,orchardcms,Sql,Performance,Orchardcms,假设我想要查询所有Orchard用户ID,并且我想要包括那些已经被删除(又称软删除)的用户。数据库包含大约1000个用户 选项A-大约需要2分钟 Orchard.ContentManagement.IContentManager lContentManager = ...; lContentManager .Query<Orchard.Users.Models.UserPart, Orchard.Users.Models.UserPartRecord>(Orchard.Cont

假设我想要查询所有Orchard用户ID,并且我想要包括那些已经被删除(又称软删除)的用户。数据库包含大约1000个用户

选项A-大约需要2分钟

Orchard.ContentManagement.IContentManager lContentManager = ...;

lContentManager
  .Query<Orchard.Users.Models.UserPart, Orchard.Users.Models.UserPartRecord>(Orchard.ContentManagement.VersionOptions.AllVersions)
  .List()
  .Select(u => u.Id)
  .ToList();
Orchard.ContentManagement.IContentManager lContentManager=。。。;
内容管理员
.Query(Orchard.ContentManagement.VersionOptions.AllVersions)
.List()
.选择(u=>u.Id)
.ToList();
选项B-执行时几乎没有明显的延迟

Orchard.Data.IRepository<Orchard.Users.Models.UserPartRecord> UserRepository = ...;

UserRepository .Fetch(u => true).Select(u => u.Id).ToList();
Orchard.Data.IRepository UserRepository=。。。;
Fetch(u=>true).Select(u=>u.Id).ToList();
在使用选项A时,我没有看到SQL Profiler中执行任何SQL查询。我想这与NHibernate或缓存有关


有没有办法优化选项A

这可能是因为
IContentManager
版本通过
InfoSet
(基本上是数据的xml表示形式)访问数据,而
IRepository
版本使用实际的DB表本身

我似乎记得读过这样一篇文章:虽然Infoset在很多情况下都很好,但当您使用排序/过滤处理较大的数据集时,直接访问表会更有效,因为使用Infoset需要在访问数据之前解析每个xml片段并提取元素

由于“转移”,Orchard同时使用这两种方法,因此您可以使用最适合您需要的方法。我现在找不到解释它的文章,但这很好地解释了shift&Infoset:


希望这对您有所帮助?

如果您使用
.Select()
部分切换
.List()
该怎么办?@devqon我无法切换它们,因为
Query()
返回了一个
IContentQuery
而它不提供
Select()
方法。有趣的。。。我对nhibernate有一些问题,但在旧的Orchard版本中。哪个版本?@urbanit它是1.9.0版。