Law*_*son 7 orchardcms orchardcms-1.9
我发现自己做了很多查询来获取大集合中的前几个项目,例如,在网站的主页上显示最近的三篇新闻文章或博客文章.
只要此查询仅涉及预定义或自定义部件,我可以执行以下操作:
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;
}
Run Code Online (Sandbox Code Playgroud)
我假设这或多或少与SELECT TOP [amount] ...SQL中的相同,并且在大量记录上具有良好的性能.
但是,有时我使用"迁移"或"导入"从外部源创建内容类型,并希望有条件地检查通用部件中的字段.在这种情况下,我没有可以作为参数传递给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;
}
Run Code Online (Sandbox Code Playgroud)
这真的很浪费并导致大集合上的大量开销但我真的,真的,真的,不想深入数据库来弄清楚Orchard的内部工作,并在每次我想做这样的事情时构建长而复杂的HQL查询.
我正在研究类似的东西(能够使用动态名称查询模型数据)。可悲的是,我还没有找到任何可以轻松做到这一点的东西。
我发现有效的方法是对数据库进行简单的 SQL 查询。如果您稍后发现自己愿意深入研究数据库,请查看此模块以获取相关语法。