1

CMS 中有一个自定义内容类型“SideBarLinks”。我创建了一个查询来获取这种类型的项目列表:“SideBarLinks”并指定了排序和过滤条件。在 CMS 中预览查询结果时,这可以正常工作。

有没有办法我可以在代码中获得相同的列表,比如在任何 Controller 的 Action 方法中?有哪些果园类/服务可以查询?以及如何在 Controller 方法中执行所有这些过滤、查询结果排序?

到目前为止,我曾经使用以下代码查询内容项,这些代码是通过博客和其他论坛引用的。完全归功于他们。这似乎初始化IOrchardServices并使用此服务获取项目。

public IOrchardServices Services { get; private set; }
public AdminController(IOrchardServices services, IShapeFactory shapeFactory) {
        Services = services;

        T = NullLocalizer.Instance;
        Logger = NullLogger.Instance;
        Shape = shapeFactory;
    } 

这是操作方法:

public ActionResult List(int id) {
            List<ContentItem> query = Services.ContentManager.GetAllVersions(id).ToList();
            if (!query.Any()) {
                return HttpNotFound();
            }

            return View(query);
        } 

如何获取特定于 Query 的项目?

4

2 回答 2

2

这是一个相当广泛的问题。我肯定会说最好的起点是源代码,答案几乎总是在源代码中。

但是这里。您需要的第一件事是内容管理器。

private readonly IContentManager _contentManager;
public MyController(IContentManager contentManager) {
    _contentManager = contentManager;
}

获取特定内容类型的列表

_contentManager.Query(VersionOptions.Published, "SideBarLinks").List();

按特定部分获取内容项列表

_contentManager.Query<UserPart, UserPartRecord>().List();

获取列表并过滤它

_contentManager.Query<UserPart, UserPartRecord>().ForVersion(VersionOptions.Latest).Where(e => e.UserName = "Bob").List();

按不同部分过滤

_contentManager.Query<UserPart, UserPartRecord>()
    .Join<CommonPartRecord>()
    .Where(e => e.CreatedUtc > DateTime.Now.AddDays(-1))
    .List();

在查询期间加载更多数据,我们稍后需要显示

_contentManager.Query<UserPart, UserPartRecord>()
    .WithQueryHints(new QueryHints().ExpandParts<ExtraUserPart>())
    .List();

我认为对 Orchard 工作原理的体面理解对于构建查询很重要。Orchard 是一个非常懒惰的系统,如果没有被告知,它就不会去加入记录表。而且由于它可以在 XML 中存储部分(如果您告诉它)和字段数据,除非您需要过滤或排序数据,否则您无需担心任何事情,Orchard 拥有您需要的所有数据. 如果您确实将数据存储在您想要稍后访问的记录类中,Orchard 将不得不稍后延迟加载它,从而导致更多的数据库查询和严重的性能损失。

于 2015-10-09T09:40:12.480 回答
1

如果要获取链接到仪表板中特定查询的内容项,可以执行以下操作:

注入投影管理器:

private readonly IProjectionManager _projectionManager;
public MyController(IProjectionManager projectionManager) {
    _projectionManager = projectionManager;
}

获取特定查询的内容项:

var contentItems = _projectionManager.GetContentItems(someQueryId);

如果你看一下 Orchard.Projections/Controllers/AdminController 你可以在这里看到预览操作:

public ActionResult Preview(int id) {
    if (!Services.Authorizer.Authorize(Permissions.ManageQueries, T("Not authorized to manage queries")))
        return new HttpUnauthorizedResult();

    var contentItems = _projectionManager.GetContentItems(id, 0, 20);
    var contentShapes = contentItems.Select(item => _services.ContentManager.BuildDisplay(item, "Summary"));

    var list = Shape.List();
    list.AddRange(contentShapes);

    return View(list);
}
于 2015-10-09T10:18:33.377 回答