假设我想查询所有 Orchard 用户 ID,并且还想包括那些已被删除(也称为软删除)的用户。该数据库包含大约 1000 个用户。
Option 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();
Option B- 执行与几乎察觉不到的延迟
Orchard.Data.IRepository<Orchard.Users.Models.UserPartRecord> UserRepository = ...;
UserRepository .Fetch(u => true).Select(u => u.Id).ToList();
使用选项 A 时,我没有看到 SQL Profiler 中执行任何 SQL 查询。我猜这与 NHibernate 或缓存有关。
有什么办法可以优化Option A?
难道是因为IContentManager
版本正在通过访问数据InfoSet
(基本上是数据的 xml 表示),其中IRepository
版本使用实际的数据库表本身。
我似乎记得读过,虽然 Infoset 在很多情况下都很棒,但当您通过排序/过滤处理较大的数据集时,直接访问表会更有效,因为使用 Infoset 需要解析每个 xml 片段并提取元素在获取数据之前。
自“转变”以来,Orchard 同时使用这两种方法,因此您可以使用最适合您需求的方法。我现在找不到解释它的文章,但这很好地解释了转变和信息集:
http://weblogs.asp.net/bleroy/the-shift-how-orchard-painless-shifted-to-document-storage-and-how-it-ll-affect-you http://weblogs.asp.net/bleroy/the-shift-how-orchard-painlessly-shifted-to-document-storage-and-how-it-ll-affect-you
希望对您有帮助吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)