Поиск страниц с любым значением в собственности - PullRequest
2 голосов
/ 12 января 2012

Только для 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);

Выдается исключение: «Значение Критерии не может быть пустым или пустым. Установите свойство IsNull для поиска пустого значения».

Есть идеи?

Ответы [ 4 ]

1 голос
/ 10 апреля 2014

Да, это сбивает с толку. В случае, если кто-то еще наткнется на это, вот как искать страницы с определенным свойством PageReference, установленным на что-то:

new PropertyCriteria()
{
    createdCriteria.Name = "MyProperty";
    createdCriteria.Type = PropertyDataType.PageReference;
    createdCriteria.Condition = EPiServer.Filters.CompareCondition.NotEqual;
    createdCriteria.Value = "0";
    createdCriteria.IsNull = false;
}
1 голос
/ 16 января 2012

Если я не пропустил уловку, это не представляется возможным при использовании 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 (не рекомендуется))

0 голосов
/ 23 августа 2012

Я видел что-то, где на странице есть скрытое свойство bool «Свойство X содержит значение», которое устанавливается в событии Saving.

Затем это свойство bool используется в качестве PropertyCriteria вместо одного.Вы ДЕЙСТВИТЕЛЬНО заинтересованы.

0 голосов
/ 12 января 2012

Чтобы найти пустые значения, необходимо указать свойство IsNull в PropertyCriteria и использовать условие сравнения Equal.

Например

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