如何在代码中获取查询预览列表 |果园1.7

How to get the Query preview list in code | Orchard 1.7

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

有没有办法在代码中获得相同的列表,比如在任何控制器的 Action 方法中? Orchard 有哪个Class/Services可以查询?以及如何在 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);
        } 

如何获取特定于查询的项目?

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

但这里是。您首先需要的是内容管理器。

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 将不得不延迟加载它,导致更多的数据库查询和严重的性能损失。

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

注入投影管理器:

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);
}