Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Orchardcms 如何在代码| Orchard 1.7中获取查询预览列表_Orchardcms_Orchardcms 1.7_Orchard Modules - Fatal编程技术网

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

Orchardcms 如何在代码| Orchard 1.7中获取查询预览列表,orchardcms,orchardcms-1.7,orchard-modules,Orchardcms,Orchardcms 1.7,Orchard Modules,CMS中有一个自定义内容类型“侧边栏链接”。我创建了一个查询来获取这种类型的项目列表:“SideBarLinks”以及指定的排序和筛选条件。在CMS中预览查询结果时,这种方法效果很好 有没有一种方法可以在代码中获得相同的列表,比如在任何控制器的操作方法中?果园的哪些类别/服务需要查询?以及如何在控制器方法中对查询结果执行所有这些过滤和排序 到目前为止,我使用以下代码查询内容项目,这些代码是我通过博客和其他论坛引用的。完全归功于他们。这似乎初始化了IOrchardServices,并使用此服务获取

CMS中有一个自定义内容类型“侧边栏链接”。我创建了一个查询来获取这种类型的项目列表:“SideBarLinks”以及指定的排序和筛选条件。在CMS中预览查询结果时,这种方法效果很好

有没有一种方法可以在代码中获得相同的列表,比如在任何控制器的操作方法中?果园的哪些类别/服务需要查询?以及如何在控制器方法中对查询结果执行所有这些过滤和排序

到目前为止,我使用以下代码查询内容项目,这些代码是我通过博客和其他论坛引用的。完全归功于他们。这似乎初始化了
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);
        } 
public ActionResult列表(int-id){
List query=Services.ContentManager.GetAllVersions(id.ToList();
如果(!query.Any()){
返回HttpNotFound();
}
返回视图(查询);
} 

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

这是一个相当广泛的问题。我肯定地说,最好从源代码开始,答案几乎总是源代码

但事情是这样的。您首先需要的是内容管理器

private readonly IContentManager _contentManager;
public MyController(IContentManager contentManager) {
    _contentManager = contentManager;
}
获取特定内容类型的列表

_contentManager.Query(VersionOptions.Published, "SideBarLinks").List();
按特定部分获取内容项列表的步骤

_contentManager.Query<UserPart, UserPartRecord>().List();
\u contentManager.Query().List();
获取列表并对其进行筛选

_contentManager.Query<UserPart, UserPartRecord>().ForVersion(VersionOptions.Latest).Where(e => e.UserName = "Bob").List();
\u contentManager.Query().ForVersion(VersionOptions.Latest).Where(e=>e.UserName=“Bob”).List();
按不同部分过滤

_contentManager.Query<UserPart, UserPartRecord>()
    .Join<CommonPartRecord>()
    .Where(e => e.CreatedUtc > DateTime.Now.AddDays(-1))
    .List();
\u contentManager.Query()
.Join()
.Where(e=>e.CreatedUtc>DateTime.Now.AddDays(-1))
.List();
在查询过程中加载更多数据,以便稍后显示

_contentManager.Query<UserPart, UserPartRecord>()
    .WithQueryHints(new QueryHints().ExpandParts<ExtraUserPart>())
    .List();
\u contentManager.Query()
.WithQueryHints(新的QueryHints().ExpandParts())
.List();

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

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

注入项目管理器:

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

我不认为这是他的意思。他的意思可能类似于
\u projectionManager.GetContentItems(queryId)
谢谢Hazza。如果这是一个非常模糊/广泛的问题,我深表歉意。下次将尽可能多地包含细节。我的要求是按名称/内容类型获取项目。你的代码样本对我有用。谢谢你帮助我。将参考代码以及@devqonThanks devqon正确指出的内容。按ID检索不是我项目的解决方案。但是,您的解决方案帮助我极大地理解了Orchard中的投影问题,因为您正确地向我指出了投影/查询的源代码。非常感谢。