如何在实现IFilterProvider的Filter的ApplyFilter方法中以编程方式过滤Orchard中的属性

时间:2015-09-24 15:03:09

标签: nhibernate orchardcms

简化型号:

public class GolfCourseDetailsPart : ContentPart<GolfCourseDetailsRecord>
{
  public bool ShowInHomePage {... //Get and Set using Retrieve and Store  methods
}

简化迁移:

ContentDefinitionManager.AlterTypeDefinition("GolfCourse", gc => gc
     //...
     .WithPart(typeof(GolfCourseDetailsPart).Name)
);

我需要过滤“GolfCourse”类型的所有项目,才能获得将ShowInHomePage设置为 true 的项目。

过滤

我创建了一个实现IFilterProvider接口的过滤器,它返回所有的GolfCourse内容项,但我还是无法通过ShowInHomePage进行过滤:

private void ApplyFilter(FilterContext context)
{
 context.Query = context.Query.Join(x=>x.ContentPartRecord(typeof(GolfCourseDetailsRecord))); 
}

如何通过属性ShowInHomePage ??

进行过滤

2 个答案:

答案 0 :(得分:2)

你几乎就在那里,唯一缺少的是.Where条款。在HQL查询中,它看起来像这样:

private void ApplyFilter(FilterContext context)
{
    context.Query = context
        .Query
        .Join(x => x.ContentPartRecord(typeof(GolfCourseDetailsRecord)))
        .Where(x => x.ContentPartRecord<GolfCourseDetailsRecord>(), g => g.Eq("ShowInHomePage", true));
}

答案 1 :(得分:1)

您是否有任何理由要创建IFilterProvider? 这些仅在您希望为查询投影提供自定义过滤器时才有用。

如果您只是想以编程方式获取过滤数据,那么我将使用ContentManager的Query方法。

以下是有关如何查询Orchard的一组示例,我认为它对您来说比我只需将您需要的查询放在此处更有用:https://orchardtrainingdemo.codeplex.com/SourceControl/latest#Controllers/ContentsAdminController.cs