Use filters to narrow down search results, or use them for database-like queries. This topic explains how to filter search results for complex objects, with the Filter method in Episerver Search & Navigation (formerly Episerver Find).
Complex object types
The REST API and .NET client API support filtering on complex objects of different types to varying degree. Supported complex objects can be divided into these types:
- Collections of native objects such as IEnumerable<int>.
- Complex objects that have properties of native objects and/or complex objects, for example an Author class.
- Collections of complex objects, such as IEnumerable<Author>.
Collection of native objects
The first type is covered by the documentation for each native type. For instance if you want to know how to filter on a property of type IEnumerable<string>, see Strings.
Complex objects with properties of native objects
The second type, complex objects, such as a property of type Author is straight forward. You can filter on its native properties just as if they were apart of the type we are searching for. For instance, to find blog posts authored by Winston Churchill, you could use the below code.
var searchQuery = client.Search<BlogPost>() .Filter(x => x.Author.Name.Match("Winston Churchill"));
One might wonder what happens if the Author property is null. Contrary to LINQ, no exception is thrown. The filter simply does not match.
Complex object collections
The final type of complex objects that you can filter on is a collection of complex objects, such as IEnumerable<Author>. The .NET client API has a filter method named MatchContained, which you can use to filter on properties of native types in objects contained in collections. Imagine that the BlogPost class no longer has an Author property but instead an Authors property of type IEnumerable<Author>. Next, use the MatchContained method to find blog posts whose Author property contains an Author with a specific name.
var searchQuery = client.Search<BlogPost>() .Filter(x => x.Authors.MatchContained(a => a.Name, "Winston Churchill"));
Note: The MatchContained syntax is a bit different from other filtering methods. The first argument is an expression identifying the property that we want to filter on. The second argument is the value.
Also, while the MatchContained method lets you filter on a single field in an object in a list, you cannot use it to express multiple conditions on the same object in the list. That is, use it to find blog posts that have an author named Winston Churchill and an author with a specific email address. You cannot use it to find blog posts with a specific author that have both a specific name and a specific email address.
Last updated: Oct 31, 2016