---
title: Search for pages based on page type
slug: cms-12/docs/searching-for-pages-based-on-page-type
docTags: 
createdAt: 2026-08-10T15:55:58.000Z
---

Optimizely's recommended search functionality is Optimizely Search & Navigation (formerly named Optimizely Find), a cloud-ready extension that lets you build advanced customized search features based on your content model.

You can programmatically search for Optimizely Content Management System (CMS) pages based on a certain **page type using** built-in functionality for non-cloud environments. By specifying search criteria and a place to start the search, you get a `PageDataCollection` containing matching pages.

The `DataFactory` contains a method called `FindPagesWithCriteria` which takes a `PageReference` (representing where to start the search) and a `PropertyCriteriaCollection` object (representing what to search for). When the `FindPagesWithCriteria` method is called it returns a `PageDataCollection` object containing matching pages.

### Create a criteria collection

1. Create a `PropertyCriteriaCollection` object that contains the individual `PropertyCriteria` objects:

```csharp
PropertyCriteriaCollection criterias = new PropertyCriteriaCollection();
```

2. Create a `PropertyCriteria` object that contains the information about the property criteria for the search.

### Create a search criteria

Define the search criteria by creating a `PropertyCriteria` object that contains the information about the property criteria for the search:

1. Set the `Condition` property to specify the type of comparison you want; for example, `CompareCondition.Equal`.
2. Set the `Name` property to the `PageTypeID` property.
3. Set the `Type` property to the `PageType` property.
4. Set the `Value` property to specify what page type to search for (the load of a page type is based on its name); for example, `PageTypeNewsItem`.
5. Set the `Required` property to **true**. This criterion is required for a match.

```csharp
PropertyCriteria criteria = new PropertyCriteria();
criteria.Condition = CompareCondition.Equal;
criteria.Name = "PageTypeID";
criteria.Type = PropertyDataType.PageType;
criteria.Value = _contentTypeRepository.Load("PageTypeNewsItem").ID.ToString();
criteria.Required = true;
```

In this example the `IPageCriteriaQueryService `and `IContentTypeRepository`interfaces are injected through Dependency Injection in the constructor of the calling class, for example, like below. The service is used to perform the search.

```csharp
private readonly IPageCriteriaQueryService _pageCriteriaQueryService;
private readonly IContentTypeRepository _contentTypeRepository;

public CustomContentLocator(IPageCriteriaQueryService pageCriteriaQueryService, IContentTypeRepository contentTypeRepository) {
  _pageCriteriaQueryService = pageCriteriaQueryService;
  _contentTypeRepository = contentTypeRepository;
}
```

### Create additional search criteria

Define another search criterion by creating a `PropertyCriteria` object that contains the information about the property criteria for the search:

1. Set the `Condition` property to specify the type of comparison you want; for example, `CompareCondition.GreaterThan`.

```csharp
PropertyCriteriaCollection criterias = new PropertyCriteriaCollection();
```

2. Set the `Name` property to the `PageCreated` property.
3. Set the `Type` property to the `Date` property.
4. Set the `Value` property to specify a period of time; for example, set it to search for pages that were created during the last 120 days.
5. Set the `Required` property to **true**, this criterion is required for a match.

```csharp
PropertyCriteria secCriteria = new PropertyCriteria();
secCriteria.Condition = EPiServer.Filters.CompareCondition.GreaterThan;
secCriteria.Name = "PageCreated";
secCriteria.Type = PropertyDataType.Date;
secCriteria.Value = DateTime.Now.AddDays(-120).ToString();
secCriteria.Required = true;
```

### Add criteria to the criteria collection

Add your specified criteria to the criteria collection as follows:

```csharp
criterias.Add(criteria);
criterias.Add(secCriteria);
```

### Execute the search

After you specify the criteria, define where to start the search. Use the start page as the search starting point.

:::hint{type="info"}
**Note**
The following example may return many matches (and in some cases could be time-consuming).
:::

```csharp
PageDataCollection _newsPageItems = _pageCriteriaQueryService.FindPagesWithCriteria(PageReference.StartPage, criterias);
```

### FilterForVisitor

The following filter removes pages that the current user does not have access to or that are not currently published:

```csharp
FilterForVisitor.Filter(_newsPageItems);
new FilterSort(FilterSortOrder.PublishedDescending).Filter(_newsPageItems);
```

You can find the source code for the `PageDataCollection` and `PageData` classes the **Framework Reference** section under the **Remarks** section for the class.
