我可以在不诉诸HQL的情况下有效地查询通用字段吗?

时间:2016-12-22 10:50:01

标签: 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;
}

我假设这或多或少与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查询我想做这样的事情。

有没有办法用IContentQuery方法重写第二个查询而不会产生大的性能损失?

1 个答案:

答案 0 :(得分:0)

我正在做类似的事情(能够使用动态名称查询模型数据)。可悲的是,我还没有发现任何让事情变得简单的事情。

我发现的方法是对数据库进行简单的SQL查询。如果您以后发现自己愿意深入研究数据库,请查看this module的语法。