【问题标题】:How to get the Query preview list in code | Orchard 1.7如何在代码中获取查询预览列表 |果园 1.7
【发布时间】:2015-10-09 08:12:26
【问题描述】:

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

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

【问题讨论】:

    标签: orchardcms orchardcms-1.7 orchard-modules


    【解决方案1】:

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

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

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

    【讨论】:

    • 我不认为这是他的意思。他的意思可能类似于_projectionManager.GetContentItems(queryId)
    • 谢谢哈扎。如果这是一个非常模糊/广泛的问题,我深表歉意。下次会尽可能详细地介绍。
    • 我的要求是按名称/内容类型获取项目。您的代码示例对我有用。谢谢你帮助我。将引用代码以及@devqon 正确指出的
    【解决方案2】:

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

    注入投影管理器:

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

    【讨论】:

    • 感谢 devqon。按 ID 检索不是我的项目的解决方案。但是您的解决方案帮助我极大地理解了 Orchard 中的 Projection 事情,因为您正确地向我指出了 Projection/Queries 的源代码。谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    相关资源
    最近更新 更多