Filter pages using LINQ queries
Sitefinity CMS supports dynamic LINQ queries that can execute lambda expressions defined in a string against an IQueryable collection. This article demonstrated how to filter monolingual and multilingual pages using two different methods: pages.Where() and DataProviderBase.SetExpressions().
Use the pages.Where() method
To filter a collection of pages by their title, perform the following:
- Use the
PageManagerclass to get all pages under the root node of your site. - Construct the string used to filter those pages by their title.
- Filter the page collection by passing the constructed string filter to the
Where()method.
To filter pages with the pages.Where() method, use the following code snippet:
using System;
using System.Linq;
using Telerik.Sitefinity.Abstractions;
using Telerik.Sitefinity.Data.Linq.Dynamic;
using Telerik.Sitefinity.Modules.Pages;
using Telerik.Sitefinity.Pages.Model;
namespace SitefinityWebApp
{
public class FilterPagesWhereMethod
{
public IQueryable<PageNode> FilterPagesWitheWhere()
{
var manager = PageManager.GetManager();
var titleFilter = "About us";
var pages = manager.GetPageNodes().Where(pn => pn.RootNodeId == SiteInitializer.CurrentFrontendRootNodeId);
var pagesFilter = String.Format("Title.ToLower().Contains(\"{0}\".ToLower())", titleFilter);
var filteredPages = pages.Where(pagesFilter);
return filteredPages;
}
}
}
NOTE: To execute dynamic LINQ queries, in your code, you must add
using Telerik.Sitefinity.Data.Linq.Dynamic;
Filter multilingual pages with the pages.Where() method
If you have multilingual pages, to ensure the filter you pass is executed against the Lstring value for the correct culture you can use the following code sample:
- Use the
PageManagerclass to get all pages under the root node of your site. - Construct a
CultureRegionclass instance with the language and culture you want to use. - Construct the string used to filter those pages by their title.
- Filter the page collection by passing the constructed string filter to the
Where()method. - Set the original thread culture.
To filter multilingual pages with the pages.Where() method, use the following code snippet:
using System;
using System.Linq;
using Telerik.Sitefinity.Abstractions;
using Telerik.Sitefinity.Data.Linq.Dynamic;
using Telerik.Sitefinity.Localization;
using Telerik.Sitefinity.Modules.Pages;
using Telerik.Sitefinity.Pages.Model;
using Telerik.Sitefinity.Services;
namespace SitefinityWebApp
{
public class FilterMultilingualPagesWhereMethod
{
public IQueryable FilterMultilingualPagesWithWhere()
{
IQueryable<PageNode> filteredPages;
var targetCulture = SystemManager.CurrentContext.AppSettings.GetCultureByName("en");
using (new CultureRegion(targetCulture))
{
var manager = PageManager.GetManager();
var titleFilter = "About us";
var pages = manager.GetPageNodes().Where(pn => pn.RootNodeId == SiteInitializer.CurrentFrontendRootNodeId);
var pagesFilter = String.Format("Title.ToLower().Contains(\"{0}\".ToLower())", titleFilter);
filteredPages = pages.Where(pagesFilter);
}
return filteredPages;
}
}
}
Use the DataProviderBase.SetExpressions() method
- Use the
PageManagerclass to get all pages under the root node of your site. - Construct the string used to filter those pages by their title.
- Filter the page collection by calling the
DataProviderBase.SetExpressions()method and passing the following parameters:filterExpressionsortExpressionskiptaketotalCount
To filter pages with the DataProviderBase.SetExpressions() method, use the following code snippet:
using System;
using System.Linq;
using Telerik.Sitefinity.Abstractions;
using Telerik.Sitefinity.Data;
using Telerik.Sitefinity.Modules.Pages;
namespace SitefinityWebApp
{
public class FilterPagesSetExpMethod
{
public IQueryable FilterPagesWithSetExpMethod()
{
var manager = PageManager.GetManager();
var pages = manager.GetPageNodes().Where(pn => pn.RootNodeId == SiteInitializer.CurrentFrontendRootNodeId);
int? totalCount = 0;
var titleFilter = "About us";
var pagesFilter = String.Format("Title.ToLower().Contains(\"{0}\".ToLower())", titleFilter);
var filteredPages = DataProviderBase.SetExpressions(pages, pagesFilter, String.Empty, 0, 0, ref totalCount);
return filteredPages;
}
}
}
NOTE: To use the DataProviderBase class, in your code, you must add
using Telerik.Sitefinity.Data;