Session: Querying: How to customize query?
Following query customization options are available in IDocumentQueryCustomization
interface:
- BeforeQueryExecution
- CustomSortUsing
- Highlight
- Include
- NoCaching
- NoTracking
- RandomOrdering
- RelatesToShape
- SetAllowMultipleIndexEntriesForSameDocumentToResultTransformer
- SetHighlighterTags
- ShowTimings
- SortByDistance
- Spatial
- TransformResults
- WaitForNonStaleResults
- WaitForNonStaleResultsAsOf
- WaitForNonStaleResultsAsOfLastWrite
- WaitForNonStaleResultsAsOfNow
- WithinRadiusOf
BeforeQueryExecution
Allows you to modify the index query just before it is executed.
IDocumentQueryCustomization BeforeQueryExecution(Action<IndexQuery> action);
Parameters | ||
---|---|---|
action | Action<IndexQuery> | Action that will modify IndexQuery. |
Return Value | |
---|---|
IDocumentQueryCustomization | Returns self for easier method chaining. |
Example
// set 'PageSize' to 10
List<Employee> results = session.Query<Employee>()
.Customize(x => x.BeforeQueryExecution(query => query.PageSize = 10))
.ToList();
CustomSortUsing
Allows you to use custom sorter on the server. Dedicated article can be found here.
IDocumentQueryCustomization CustomSortUsing(string typeName);
IDocumentQueryCustomization CustomSortUsing(string typeName, bool descending);
Parameters | ||
---|---|---|
typeName | string | AssemblyQualifiedName of a custom sorter available on server-side. |
descending | bool | indicates if results should be ordered descending or ascending |
Return Value | |
---|---|
IDocumentQueryCustomization | Returns self for easier method chaining. |
Highlight
Please check our dedicated article.
Include
Please check our dedicated article.
NoCaching
By default, queries are cached. To disable query caching use NoCaching
customization.
IDocumentQueryCustomization NoCaching();
Return Value | |
---|---|
IDocumentQueryCustomization | Returns self for easier method chaining. |
Example
List<Employee> results = session.Query<Employee>()
.Customize(x => x.NoCaching())
.Where(x => x.FirstName == "Robert")
.ToList();
NoTracking
To disable entity tracking by Session
use NoTracking
. Usage of this option will prevent holding query results in memory.
IDocumentQueryCustomization NoTracking();
Return Value | |
---|---|
IDocumentQueryCustomization | Returns self for easier method chaining. |
Example
List<Employee> results = session.Query<Employee>()
.Customize(x => x.NoTracking())
.Where(x => x.FirstName == "Robert")
.ToList();
RandomOrdering
To order results randomly use RandomOrdering
method.
IDocumentQueryCustomization RandomOrdering();
IDocumentQueryCustomization RandomOrdering(string seed);
Parameters | ||
---|---|---|
seed | string | Seed used for ordering. Useful when repeatable random queries are needed. |
Return Value | |
---|---|
IDocumentQueryCustomization | Returns self for easier method chaining. |
Example
// results will be ordered randomly each time
List<Employee> results = session.Query<Employee>()
.Customize(x => x.RandomOrdering())
.Where(x => x.FirstName == "Robert")
.ToList();
RelatesToShape
Please check our dedicated article.
SetAllowMultipleIndexEntriesForSameDocumentToResultTransformer
If set to true, multiple index entries will be send from the same document (assuming the index project them) to the result transformer function. Otherwise, those entries will be consolidate an the transformer will be called just once for each document in the result set.
IDocumentQueryCustomization
SetAllowMultipleIndexEntriesForSameDocumentToResultTransformer(bool val);
Parameters | ||
---|---|---|
val | bool | Indicates if multiple index entries can be send from the same document to result transformer. |
Return Value | |
---|---|
IDocumentQueryCustomization | Returns self for easier method chaining. |
Example
List<Employee> results = session.Query<Employee>()
.Customize(x => x.SetAllowMultipleIndexEntriesForSameDocumentToResultTransformer(true))
.TransformWith<Employees_NoLastName, Employee>()
.Where(x => x.FirstName == "Robert")
.ToList();
SetHighlighterTags
Please check our dedicated article.
ShowTimings
By default, detailed timings (duration of Lucene search, loading documents, transforming results) in queries are turned off, this is due to small overhead that calculation of such timings produces.
IDocumentQueryCustomization ShowTimings();
Return Value | |
---|---|
IDocumentQueryCustomization | Returns self for easier method chaining. |
Returned timings:
- Query parsing
- Lucene search
- Loading documents
- Transforming results
Example
RavenQueryStatistics stats;
List<Employee> results = session.Query<Employee>()
.Customize(x => x.ShowTimings())
.Statistics(out stats)
.Where(x => x.FirstName == "Robert")
.ToList();
Dictionary<string, double> timings = stats.TimingsInMilliseconds;
TransformResults
TransformResults
is a client-side function that allows any transformations on query results.
IDocumentQueryCustomization TransformResults(
Func<IndexQuery, IEnumerable<object>, IEnumerable<object>> resultsTransformer);
Parameters | ||
---|---|---|
resultsTransformer | Func<IndexQuery, IEnumerable<object>, IEnumerable<object>> | Transformation function. |
Return Value | |
---|---|
IDocumentQueryCustomization | Returns self for easier method chaining. |
Example
// filter-out all results where 'LastName' equals 'Doe' on client-side
List<Employee> results = session.Query<Employee>()
.Customize(x => x.TransformResults((indexQuery, queryResults) => queryResults.Cast<Employee>().Where(q => q.LastName != "Doe")))
.Where(x => x.FirstName == "Robert")
.ToList();
WaitForNonStaleResults
Note
This methods should be used only for testing purposes and are considered EXPERT ONLY
Queries can be 'instructed' to wait for non-stale results for specified amount of time using WaitForNonStaleResults
method. It is not advised to use this method, because on live databases indexes might never become unstale.
IDocumentQueryCustomization WaitForNonStaleResults();
IDocumentQueryCustomization WaitForNonStaleResults(TimeSpan waitTimeout);
Parameters | ||
---|---|---|
waitTimeout | TimeSpan | Time to wait for index to return non-stale results. Default: 15 seconds. |
Return Value | |
---|---|
IDocumentQueryCustomization | Returns self for easier method chaining. |
Example
List<Employee> results = session.Query<Employee>()
.Customize(x => x.WaitForNonStaleResults())
.Where(x => x.FirstName == "Robert")
.ToList();
WaitForNonStaleResultsAsOf
Queries can be 'instructed' to wait for non-stale results as of cutoff DateTime or Etag for specified amount of time using WaitForNonStaleResultsAsOf
method.
IDocumentQueryCustomization WaitForNonStaleResultsAsOf(DateTime cutOff);
IDocumentQueryCustomization WaitForNonStaleResultsAsOf(
DateTime cutOff,
TimeSpan waitTimeout);
IDocumentQueryCustomization WaitForNonStaleResultsAsOf(Etag cutOffEtag);
IDocumentQueryCustomization WaitForNonStaleResultsAsOf(
Etag cutOffEtag,
TimeSpan waitTimeout);
Parameters | ||
---|---|---|
cutOff | DateTime | Minimum modified date of last indexed document. If last indexed document modified date is greater than this value the results are considered non-stale. |
cutOffEtag | Etag | Minimum Etag of last indexed document. If last indexed document etag is greater than this value the results are considered non-stale. |
waitTimeout | TimeSpan | Time to wait for index to return non-stale results. Default: 15 seconds. |
Return Value | |
---|---|
IDocumentQueryCustomization | Returns self for easier method chaining. |
WaitForNonStaleResultsAsOfLastWrite
Queries can be 'instructed' to wait for non-stale results as of last write made by any session belonging to the current DocumentStore using WaitForNonStaleResultsAsOfLastWrite
method.
This method internally uses WaitForNonStaleResultsAsOf
and passes last written Etag, which DocumentStore tracks, to cutOffEtag
parameter.
IDocumentQueryCustomization WaitForNonStaleResultsAsOfLastWrite();
IDocumentQueryCustomization WaitForNonStaleResultsAsOfLastWrite(TimeSpan waitTimeout);
Parameters | ||
---|---|---|
waitTimeout | TimeSpan | Time to wait for index to return non-stale results. Default: 15 seconds. |
Return Value | |
---|---|
IDocumentQueryCustomization | Returns self for easier method chaining. |
Example
List<Employee> results = session.Query<Employee>()
.Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
.Where(x => x.FirstName == "Robert")
.ToList();
WaitForNonStaleResultsAsOfNow
WaitForNonStaleResultsAsOfNow
internally uses WaitForNonStaleResultsAsOf
and passes DateTime.Now
to cutOff
parameter.
IDocumentQueryCustomization WaitForNonStaleResultsAsOfNow();
IDocumentQueryCustomization WaitForNonStaleResultsAsOfNow(TimeSpan waitTimeout);
Parameters | ||
---|---|---|
waitTimeout | TimeSpan | Time to wait for index to return non-stale results. Default: 15 seconds. |
Return Value | |
---|---|
IDocumentQueryCustomization | Returns self for easier method chaining. |
Example
List<Employee> results = session.Query<Employee>()
.Customize(x => x.WaitForNonStaleResultsAsOfNow())
.Where(x => x.FirstName == "Robert")
.ToList();
WithinRadiusOf
Please check our dedicated article.