Session: Querying: How to Perform Queries Lazily

In some situations, query execution must be delayed. To cover such a scenario, Lazily and many other query extensions have been introduced.

Lazily and LazilyAsync

Lazy<IEnumerable<T>> Lazily<T>();

Lazy<IEnumerable<T>> Lazily<T>(Action<IEnumerable<T>> onEval);

Lazy<Task<IEnumerable<T>>> LazilyAsync<T>();

Lazy<Task<IEnumerable<T>>> LazilyAsync<T>(Action<IEnumerable<T>> onEval);
Parameters
onEval Action<IEnumerable<TResult>> An action that will be performed on the query results.
Return Value
Lazy<IEnumerable<TResult>> Lazy query initializer returning query results.

Example

Lazy<IEnumerable<Employee>> employeesLazy = session
    .Query<Employee>()
    .Where(x => x.FirstName == "Robert")
    .Lazily();

IEnumerable<Employee> employees = employeesLazy.Value; // query will be executed here
Lazy<Task<IEnumerable<Employee>>> employeesLazy = session
    .Query<Employee>()
    .Where(x => x.FirstName == "Robert")
    .LazilyAsync();

IEnumerable<Employee> employees = await employeesLazy.Value; // query will be executed here

Counts

Lazy<int> CountLazily<T>();

Lazy<Task<int>> CountLazilyAsync<T>(CancellationToken token = default(CancellationToken));
Return Value
Lazy Lazy query initializer returning a count of matched documents.

Example

Lazy<int> countLazy = session
    .Query<Employee>()
    .Where(x => x.FirstName == "Robert")
    .CountLazily();

int count = countLazy.Value; // query will be executed here

Suggestions

Lazy<Dictionary<string, SuggestionResult>> ExecuteLazy(Action<Dictionary<string, SuggestionResult>> onEval = null);

Lazy<Task<Dictionary<string, SuggestionResult>>> ExecuteLazyAsync(Action<Dictionary<string, SuggestionResult>> onEval = null, CancellationToken token = default);
Return Value
Lazy<Dictionary<string, SuggestionResult>> Lazy query initializer containing a dictionary with suggestions for matching executed query

Example

Lazy<Dictionary<string, SuggestionResult>> suggestLazy = session
    .Query<Employee>("Employees_ByFullName")
    .SuggestUsing(builder => builder.ByField("FullName", "johne"))
    .ExecuteLazy();

Dictionary<string, SuggestionResult> suggest = suggestLazy.Value; // query will be executed here
List<string> suggestions = suggest["FullName"].Suggestions;

Facets

Lazy<Dictionary<string, FacetResult>> ExecuteLazy(Action<Dictionary<string, FacetResult>> onEval = null);

Lazy<Task<Dictionary<string, FacetResult>>> ExecuteLazyAsync(Action<Dictionary<string, FacetResult>> onEval = null, CancellationToken token = default);
Return Value
Lazy<Dictionary<string, FacetResult>> Lazy query initializer containing a dictionary with facet results matching executed query

Example

Lazy<Dictionary<string, FacetResult>> facetsLazy = session
    .Query<Camera>("Camera/Costs")
    .AggregateUsing("facets/CameraFacets")
    .ExecuteLazy();

Dictionary<string, FacetResult> facets = facetsLazy.Value; // query will be executed here
FacetResult results = facets["Manufacturer"];