---
title: Search for pages based on page type
slug: cms-11/dev-docs/searching-for-pages-based-on-page-type
docTags: 
createdAt: 2026-07-22T19:45:20.282Z
---

Optimizely Content Management System (CMS) recommends Optimizely Search & Navigation, a cloud-ready extension that lets you build advanced customized search features based on your content model.

You can programmatically search for CMS pages for non-cloud environments based on a certain **page type using** built-in functionality. 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 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 = Locate.ContentTypeRepository().Load("PageTypeNewsItem").ID.ToString();
criteria.Required = true;
```

### 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; for example, set to search for pages created in 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 your 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 = Locate.PageCriteriaQueryService().FindPagesWithCriteria(PageReference.StartPage, criterias);
```

### FilterForVisitor

Filter for visitors. 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.
