我发现自己做了很多查询来获取大集合的前几项,例如在网站主页上显示三篇最新的新闻文章或博客文章。
只要此查询仅涉及预定义或自定义零件,我就可以执行以下操作:
public IEnumerable<ContentItem> GetTopArticles(int amount)
{
var cultureRecord = _cultureManager.GetCultureByName(_orchardServices.WorkContext.CurrentCulture);
var articles = _orchardServices.ContentManager.Query().ForType("Article")
.Where<LocalizationPartRecord>(lpr => lpr.CultureId == cultureRecord.Id)
.OrderBy<CommonPartRecord>(cpr => cpr.PublishedUtc)
.Slice(0, amount);
return articles;
}
我假设这将或多或少与SELECT TOP [amount] ...
SQL 中的 a 相同,并且在大量记录上具有良好的性能。
但是,有时我使用迁移或导入从外部源创建内容类型,并希望有条件地检查通用部件中的字段。在这种情况下,我没有可以作为参数传递给 ContentQuery 方法的 Part 或 PartRecord 类,如果我想对当前执行的任何字段进行条件检查,请执行以下操作:
public IEnumerable<ContentItem> GetTopArticles(int amount)
{
var articles = _orchardServices.ContentManager.Query().ForType("Article")
.OrderBy<CommonPartRecord>(cpr => cpr.PublishedUtc)
.List()
.Where(a => a.Content.Article.IsFeatured.Value == true)
.Take(amount);
return articles;
}
这真的很浪费,并且会在大集合上造成很大的开销,但我真的,真的,不想钻研数据库来弄清楚 Orchard 的内部工作原理,并且每次我想做这样的事情时都构造长而复杂的 HQL 查询。