我发现自己做了很多查询来获取大集合中的前几个项目,例如在网站的主页上显示最近的三篇新闻文章或博客文章。
只要此查询仅涉及预定义或自定义部件,我就可以执行以下操作:
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;
}
我假设这或多或少与SQL中的SELECT TOP [amount] ...
相同,并且在大量记录上具有良好的性能。
但是,有时我使用“迁移”或“导入”从外部源创建内容类型,并希望有条件地检查通用部件中的字段。在这种情况下,我没有可以作为参数传递给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查询我想做这样的事情。
答案 0 :(得分:0)
我正在做类似的事情(能够使用动态名称查询模型数据)。可悲的是,我还没有发现任何让事情变得简单的事情。
我发现的方法是对数据库进行简单的SQL查询。如果您以后发现自己愿意深入研究数据库,请查看this module的语法。