假设我想查询所有Orchard用户ID,并且我想要包括那些已被删除(也称为软删除)的用户。数据库包含大约1000个用户。
选项A - 大约需要2分钟
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
CustomViewHolder holder = (CustomViewHolder) view.getTag();
int position = holder.getPosition();
FeedItem feedItem = feedItemList.get(position);
Toast.makeText(mContext, feedItem.getTitle(), Toast.LENGTH_SHORT).show();
}};
选项B - 以几乎无法察觉的延迟执行
Orchard.ContentManagement.IContentManager lContentManager = ...;
lContentManager
.Query<Orchard.Users.Models.UserPart, Orchard.Users.Models.UserPartRecord>(Orchard.ContentManagement.VersionOptions.AllVersions)
.List()
.Select(u => u.Id)
.ToList();
使用选项A时,我没有看到在SQL事件探查器中执行任何SQL查询。我想这与NHibernate或缓存有关。
有没有办法优化选项A ?
答案 0 :(得分:2)
可能是因为IContentManager
版本正在通过InfoSet
访问数据(基本上是数据的xml表示),其中IRepository
版本使用实际的数据库表本身。
我似乎记得读过虽然Infoset在许多情况下都很棒,但是当你处理带有排序/过滤的更大数据集时,直接使用表更有效率,因为使用Infoset需要解析每个xml片段在获取数据之前提取的元素。
自“转变”以来,Orchard使用两者,因此您可以使用最适合您需求的方法。我找不到现在解释它的文章,但这解释了这个转变&amp; infosets非常好:
希望对你有帮助吗?