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