7

我发现自己做了很多查询来获取大集合的前几项,例如在网站主页上显示三篇最新的新闻文章或博客文章。

只要此查询仅涉及预定义或自定义零件,我就可以执行以下操作:

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 查询。

有没有什么方法可以用 IContentQuery 方法重写第二个查询而不会对性能造成很大影响?

4

1 回答 1

0

我正在研究类似的东西(能够使用动态名称查询模型数据)。可悲的是,我还没有找到任何让它变得容易的东西。

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

于 2016-12-22T13:42:37.607 回答