我发现自己做了很多查询来获取大集合中的前几个项目,例如,在网站的主页上显示最近的三篇新闻文章或博客文章.
只要此查询仅涉及预定义或自定义部件,我可以执行以下操作:
public IEnumerable<ContentItem> GetTopArticles(int amount)
{
var cultureRecord = _cultureManager.GetCultureByName(_orchardServices.WorkContext.CurrentCulture);
var articles = _orchardServices.ContentManager.Query().ForType("Article")
.Where<LocalizationPartRecord>(lpr => lpr.CultureId == cultureRecord.Id)
.OrderBy<CommonPartRecord>(cpr => cpr.PublishedUtc)
.Slice(0, amount);
return articles;
}
Run Code Online (Sandbox Code Playgroud)
我假设这或多或少与SELECT TOP [amount] ...
SQL中的相同,并且在大量记录上具有良好的性能.
但是,有时我使用"迁移"或"导入"从外部源创建内容类型,并希望有条件地检查通用部件中的字段.在这种情况下,我没有可以作为参数传递给ContentQuery方法的Part或PartRecord类,如果我想对任何字段进行条件检查,我现在做这样的事情:
public IEnumerable<ContentItem> GetTopArticles(int amount)
{
var articles = _orchardServices.ContentManager.Query().ForType("Article")
.OrderBy<CommonPartRecord>(cpr => cpr.PublishedUtc)
.List()
.Where(a => a.Content.Article.IsFeatured.Value == true)
.Take(amount);
return articles;
}
Run Code Online (Sandbox Code Playgroud)
这真的很浪费并导致大集合上的大量开销但我真的,真的,真的,不想深入数据库来弄清楚Orchard的内部工作,并在每次我想做这样的事情时构建长而复杂的HQL查询.
我创建了一个 PersonPart 并将它附加到我的 Employee 类型。它包含一个名字和一个姓氏,并实现ITitleAspect
了当我创建一堆员工时,他们不会在内容列表中都显示为“员工”。现在我想创建一个投影,显示按姓氏字母顺序排列的所有员工。
我怎样才能做到这一点?是否有任何接口,我可以实现,使FirstName
和LastName
可作为排序标准?
public class PersonPart : ContentPart<PersonPartRecord>, ITitleAspect
{
[Required]
[DisplayName("First name")]
public string FirstName
{
get { return Retrieve(r => r.FirstName); }
set { Store(r => r.FirstName, value); }
}
[Required]
[DisplayName("Last name")]
public string LastName
{
get { return Retrieve(r => r.LastName); }
set { Store(r => r.LastName, value); }
}
public string Title
{
get { return LastName + " " + FirstName; }
}
}
Run Code Online (Sandbox Code Playgroud) 也许这比Orchard问题更像是ASP.NET MVC问题,但是我对这两个问题都比较陌生,在任何情况下我都不知道答案。
从技术上讲,ASP.NET MVC应用程序没有单一入口点,那么我应该在哪里放置我希望每次有人访问任何页面时都始终运行的代码,而不管其层,起源或权限如何?果园有做到这一点的特定方法吗?
如果有所作为,那么我目前正在尝试做的是限制可以访问我的网站的IP范围。我想查看每个传入的请求,并检查用户是否已通过身份验证,或者是否具有我在自定义设置中配置的允许范围内的IP。
我可以想到一些快速而又肮脏的方法来实现此目的,例如将检查Layout
并围绕我的所有区域包装一个条件,或者实施IThemeSelector
以切换到其他主题,但是我想正确地做到这一点。
我像这样覆盖了Zone-AsideSecond模板,为标签添加了一些类:
@{
Model.Id = "zone-aside-second";
var tag = Tag(Model, "section");
tag.Attributes.Add("data-spy", "affix");
tag.Attributes.Add("data-offset-top", "300");
}
@tag.StartElement
@DisplayChildren(Model)
@tag.EndElement
Run Code Online (Sandbox Code Playgroud)
但是现在区域中的小部件不再尊重它们的位置,只是按它们创建的顺序呈现.我尝试像这样修复它:
Model.Items = ((IEnumerable<dynamic>)Model.Items).OrderBy(c => Int32.Parse(c.ContentItem.WidgetPart.Position));
Run Code Online (Sandbox Code Playgroud)
但这似乎并没有什么不同.
我在 Orchard CMS (1.10) 中创建了一个自定义模块,它公开了一个 API 端点。我想公开一个 Get 调用,如果我传递内容项的 ID,它将返回该内容项的 Html。
我也想知道如何在 API 调用中返回页面布局 html?
谢谢
我是果园的新手,我想在果园中创建一个已经在 ASP.NET MVC5 中构建的网站主题。我是否需要将我的标记从以前的 Layout.cshtml 页面复制到 orchard themes/MyTheme/Views/Layout.cshtml 页面中或需要其他任何内容?
提前致谢...!