搜索属性中具有任何值的页面

时间:2012-01-12 06:21:33

标签: c# .net episerver

仅限EPiServer:

如何在给定属性中搜索具有任何值的页面?我可以搜索属性中具有特定值的页面,但我无法弄清楚如何搜索“非空”。

例如,这不起作用:

var criterias = newPropertyCriteriaCollection
{
  new PropertyCriteria()
  { 
    Condition = CompareCondition.NotEqual, 
    Name = "MyProperty", 
    IsNull = false, 
    Type = PropertyDataType.String, 
    Value = "" 
  }
};

var pages = DataFactory.Instance.FindPagesWithCriteria(PageReference.StartPage, criterias);

抛出异常,“crieria值不能为null或为空。设置IsNull属性以搜索null。”

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

除非我错过了一个技巧,否则使用EPiServer PropertyCriteriaCollection似乎不可能。

我在反射器中进行了挖掘,这是我的发现。 FPWC方法最终调用EPiServer.DataAccess.PropertySearchDB.FastFindPagesWithCriteria()。

在此方法中如下:

    foreach (PropertyCriteria criteria in criterias)
    {
      if (criteria.IsNull)
      {
        criteria.Value = null;
      }
      else if (string.IsNullOrEmpty(criteria.Value))
      {
        throw new EPiServerException("The crieria value cannot be null or empty. Set the IsNull property to search for null.");
      }
      ...
    }

因此,如果不将IsNull设置为true,则无法搜索空字符串值。然后将其反馈到EPiServer.DataAccess.PropertySearchDB.ExecuteCriteria方法,该方法构造并格式化DB命令。因为IsNull为true,所以使用netPropertySearchNull存储过程。搜索字符串需要使用netPropertySearchString存储过程。

  if (criteria.IsNull && !PageDB.IsMetaData(criteria.Name))
  {
    cmd.CommandText = "netPropertySearchNull";
  }

我的建议是加载完整的页面列表并使用linq过滤。或者,您可以考虑绕过API并实现直接数据库查询,或使用一些低级EPiServer数据访问方法(不推荐)

为我的第一个答案道歉 - 我真的应该在发布前测试代码:)

答案 1 :(得分:1)

是的,这令人困惑。如果其他人偶然发现了这个问题,请按照以下方法搜索具有某个PageReference属性的页面:

new PropertyCriteria()
{
    createdCriteria.Name = "MyProperty";
    createdCriteria.Type = PropertyDataType.PageReference;
    createdCriteria.Condition = EPiServer.Filters.CompareCondition.NotEqual;
    createdCriteria.Value = "0";
    createdCriteria.IsNull = false;
}

答案 2 :(得分:0)

我已经看到某个页面有一个隐藏的bool属性“属性X包含一个值”,它在Saving事件中设置。

然后将该bool属性用作PropertyCriteria而不是您真正感兴趣的属性。

答案 3 :(得分:-2)

要查找空值,您需要在PropertyCriteria上指定IsNull 属性并使用Equal compare条件。

E.g

var criterias = newPropertyCriteriaCollection
{
  new PropertyCriteria()
  { 
    Condition = CompareCondition.NotEqual, 
    Name = "MyProperty", 
    IsNull = true, 
    Type = PropertyDataType.String
  }
};