2012-01-12 2 views
2

Только 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 не может быть нулевым или пустым Установите IsNull свойства для поиска нуля..»

Любые идеи?

ответ

-2

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

например

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

Мне нужны НЕ-пустые значения. Свойство PropertyCriteria, которое вы предложили, просто дает мне коллекцию всех страниц, на которых нет набора свойств. Мне нужны те, у которых установлен набор значений. –

+0

Я сделал опечатку, CompareCondition должен был NotEqual. Я исправил это. Обновление - это все еще не работает. Хммм. – tompipe

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 истина. Затем он передается в метод EPiServer.DataAccess.PropertySearchDB.ExecuteCriteria, который создает и форматирует команду DB. Поскольку IsNull истинно, используется хранимый proc netPropertySearchNull. Поиск строки требует использования хранимой процедуры netPropertySearchString.

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

Мое предложение состоит в том, чтобы загрузить полный список страниц и фильтровать с помощью linq. В качестве альтернативы вы можете изучить обход API и реализовать прямой запрос БД или использовать некоторые из методов доступа к данным низкого уровня EPiServer (не рекомендуется)

Извинения за мой первый ответ - мне действительно нужно проверить код перед отправкой :)

0

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

Тогда это свойство BOOL используется в качестве PropertyCriteria вместо того, что вы действительно заинтересованы.

1

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

Смежные вопросы