如何在代码中获取查询预览列表 |果园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);
}
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);
}